NC19943. [CQOI2016]伪光滑数
描述
输入描述
只有一行,为用空格隔开的整数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; }