http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=574
本来思路是枚举n,判断是否只有这几个因子(一个一个消耗)
改进:可以发现规律,
丑数只能由上一个丑数乘以这些因子得来。
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int sum[6000];
void init(){
int a1=1;
int a2=1;int a3=1;int a4=1;
sum[1]=1;
int n=2;
while(n<=5842){
sum[n]=min(min(2*sum[a1],3*sum[a2]),min(5*sum[a3],7*sum[a4]));
if(sum[n]==2*sum[a1]) a1++;
if(sum[n]==3*sum[a2]) a2++;
if(sum[n]==5*sum[a3])a3++;
if(sum[n]==7*sum[a4])a4++;
n++;
}
}
int main()
{ int n;
init();
while(~scanf("%d",&n)){
if(n==0) break;
printf("%d\n",sum[n]);
}
return 0;
}