列表

详情


NC19943. [CQOI2016]伪光滑数

描述

若一个大于R的整数J的质因数分解有F项,其最大的质因子为ak,并且满足ak^k ≤ N, ak < 128,我们就称整数J为N-伪光滑数。 
现在给出L,求所有整数中,第E大的N-伪光滑数。

输入描述

只有一行,为用空格隔开的整数L和E。
2 ≤ N ≤ 10^18, 1 ≤ K ≤ 800000,保证至少有 E 个满足要求的数

输出描述

只有一行,为一个整数,表示答案。

示例1

输入:

12345 20

输出:

9167

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 1024ms, 内存消耗: 131920K, 提交时间: 2020-04-03 11:35:38

#include<bits/stdc++.h>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
using namespace std;
int k,cnt,p[150];
ll n;
bool vst[150];
struct data{ll t,x,y,z;};
bool operator <(data a,data b){return a.t<b.t;}
priority_queue<data> q;
int main()
{
	scanf("%lld%d",&n,&k);
	F(i,2,128) if (!vst[i])
	{
		p[++cnt]=i;ll x=i;
		for(int j=1;x<=n;j++,x*=i) q.push((data){x,i,j-1,cnt-1});
		F(j,2,128/i) vst[i*j]=true;
	}
	F(i,1,k)
	{
		data tmp=q.top();q.pop();
		if (i==k){printf("%lld\n",tmp.t);return 0;}
		if (tmp.y) F(j,1,tmp.z) q.push((data){tmp.t/tmp.x*p[j],tmp.x,tmp.y-1,j});
	}
	return 0;
}

上一题