「题解」:$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;
}
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号