USACO官方解法:爲了實現起來更簡單,咱們把1也做爲一個醜數。當咱們已知前k個醜數,想獲得k+1個,能夠這樣作:對於每一個質數p 尋找最小的醜數h使得h*p比上一個醜數大取咱們找到的h*p中最小的一個:它就是下一個醜數爲了使搜索更快,咱們能夠爲每一個質數維護一個索引"pindex」表示每一個質數已經乘到了哪一個醜數,每次都從那裏開始,而不是再從頭再來。ios
/* ID:jzzlee1 PROB:humble LANG:C++ */ //#include<iostream> #include<fstream> #include<string> #include<algorithm> #include<cstdio> using namespace std; ifstream cin("humble.in"); ofstream cout("humble.out"); long chou[100010];int p[110],pa[110]; int main() { int i,k,n,num=1; cin>>k>>n; for(i=0;i<k;i++) cin>>p[i]; chou[0]=1; while(num!=n+1) { long long min=0x7FFFFFFF; int m=-1; for(i=0; i<k; i++) { while((long long)p[i] * chou[pa[i]] <= chou[num-1]) pa[i]++; if((long long)p[i] * chou[pa[i]] < min) { min = p[i] * chou[pa[i]]; m = i; } } chou[num++] = min; pa[m]++; } cout<<chou[n]<<endl; return 0; }