时间限制: 1 Sec 内存限制: 512 MB
题面谢绝公开。
维护一个队列,开15个指针,对应前15个素数。
对于每一次添加数字,暴扫15个指针,将指针对应的素数与指针所在位置的元素相乘塞进队列。对应指针后移一位。
可以保证每次添加的都是当前能添加的最小元素。
复杂度……我不会证。
代码:
#include <bits/stdc++.h>
#define rint register int
#define ll long long
#define inf 0x7fffffffffffffff
using namespace std;
const int prime[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
int B,K,cnt=0,it[20];
ll ans[10000070];
int main()
{
scanf("%d %d",&B,&K);
ll tmp=inf,p=1;
int pos;ans[1]=1;cnt=1;
while(cnt<=K)
{
tmp=inf;
for(rint i=1;i<=B;++i)
{
while(ans[it[i]]*prime[i]<=ans[cnt])it[i]++;
p=ans[it[i]]*prime[i];
if(p<tmp){tmp=p;pos=i;}
}
ans[++cnt]=tmp;
it[pos]++;
}
printf("%lld\n",ans[K]);
return 0;
}
原文:https://www.cnblogs.com/xingmi-weiyouni/p/11728576.html