「题解」:$Smooth$
问题 A: Smooth
时间限制: 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; }