時間限制: 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; }