「题解」:$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;
}

 

posted @ 2019-10-23 20:19  hzoi_Joe  阅读(188)  评论(0编辑  收藏  举报