时间限制: 1 Sec 内存限制: 512 MBc++
题面谢绝公开。spa
维护一个队列,开15个指针,对应前15个素数。指针
对于每一次添加数字,暴扫15个指针,将指针对应的素数与指针所在位置的元素相乘塞进队列。对应指针后移一位。blog
能够保证每次添加的都是当前能添加的最小元素。队列
复杂度……我不会证。内存
代码:it
#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; }