トピック要件
謙虚な数は、他のに加えて、素因数のみ2,3,5,7- 4の数は、もはや含まれていない
他の素因数を。
注1は、醜い醜い前に20の番号の数と考えられている
1、2、3、4、5、6、7、8、9、10、12、14、15、16、18、20、21、 24、25、27、...、
入力
ライン当たりN、1 <= N <= 5842は、Nは、 ゼロ入力の終わりである。
出力は
、対応するN番目の醜い番号を出力する。
サンプル入力
生
1。
2
3。
4。
11。
12は、
13であります
21は、
22が
23である
100
千
5842
0
サンプル出力
生
。1
2
3
4
12である
14
15
28
30
32
450
385 875
2000000000.
のみ常にタイムアウトを表示する、従来のトラバース割り切れる番号が0に等しいかどうかを調べるために、この質問の前に。最近、私は、ベクトル、セット、マップや優先順位キュー付け足しを見ました。
、番号は醜い2,3,5,7-の複数の第1のパスである場合、長い最小数が撮影するたびに生成されたすべての醜い数を維持する優先キューに醜い1から開始し、最小数としてとして、行うことは非常にシンプルそれそれはプライオリティキューですので、それは小さなから大規模に直接配置することができ、2,3,5,7-自然な次のいくつかの醜いを掛けすることができ、そうすることは数字が繰り返されることに留意すべきであるので、重い行くことを覚えておいてください。最後に、ちょうど数与えられた、あなたはの場所に醜いの数を知ることができることを知っています。
完全なコード
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#include<set>
#include<queue>
using namespace std;
typedef long long LL;
const int num[4]={2,3,5,7};
int main()
{
priority_queue<LL,vector<LL>,greater<LL> >pq;//从小到大的优先队列
set<LL>s;//set
int n=1,t;
int a[5844];
pq.push(1);//插入刚开始的1
s.insert(1);
for(int i=1; ;i++)
{
LL x=pq.top();pq.pop();
if(i==n)
{
a[n]=x;
n++;
if(n==5843)
break;
}
for(int j=0;j<4;j++)
{
LL x2=x*num[j];
if(!s.count(x2))
{
s.insert(x2);
pq.push(x2);//不断更新队列
}
}
}
while(cin>>t)
{
if(t==0)break;
cout<<a[t]<<endl;
}
return 0;
}
その後、知識の高齢者コホートについて尋ね、彼は私が複雑なんです。。。
アイデアは、まず決定し、最適解を見つけるために使用することができるANS [1] = 1、2を選択する2,3,5,7-点ANS [1]、4つの方法があります。だから我々は第三、第二を決定することができます。。。。
コードステッカーのこの部分
inline void init()
{
ans[1] = 1;
fill(p, p + 4, 1);//置1
ll val;
for(int i=2; i<=maxN; i++)
{
val = MIN_4(ans[p[0]] * 2LL, ans[p[1]] * 3LL, ans[p[2]] * 5LL, ans[p[3]] * 7LL);
if(val == ans[p[0]] * 2LL) p[0]++;
if(val == ans[p[1]] * 3LL) p[1]++;
if(val == ans[p[2]] * 5LL) p[2]++;
if(val == ans[p[3]] * 7LL) p[3]++;
ans[i] = val;
}
}