「題解」:$Smooth$

問題 A: Smooth

時間限制: 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;
}
相關文章
相關標籤/搜索