首页 > 代码库 > hdu 1058 Humble Numbers(构造?枚举?)

hdu 1058 Humble Numbers(构造?枚举?)

题意:

一个数的质因子如果只是2,3,5,7中的若干个。则这个数叫做humble number。

例如:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ...

给n,问第n个humble number是多少。

 

思路:

所有的humble数的构造都是:(2^a)*(3^b)*(5^c)*(7^d)。a,b,c,d大于等于0。

X=a+b+c+d代表这个数是第X个humble数。

假设前i-1个humble数已经求出来了,第i个humble数如何求呢?

一定是前i-1个humble数中的某个humble数乘以2或乘以3或乘以5或乘以7得到的。

好了,枚举前i-1个humble数,找出大于第i-1个humble数并且是最小,那么它就是第i个humble数了。

看代码

 

代码:

ll a[5850];int cn=0;int main(){    a[1]=1;    cn=1;    while(cn<5842){        ll ans=INF;        ll temp;        rep(i,1,cn){            temp=a[i]*2;    if(temp>a[cn]) ans=min(ans,temp);            temp=a[i]*3;    if(temp>a[cn]) ans=min(ans,temp);            temp=a[i]*5;    if(temp>a[cn]) ans=min(ans,temp);            temp=a[i]*7;    if(temp>a[cn]) ans=min(ans,temp);        }        a[++cn]=ans;    }    int n;    while(scanf("%d",&n),n){        int t=n%10;        if(t==1 && n%100!=11){            printf("The %dst humble number is ",n);        }        else if(t==2 && n%100!=12){            printf("The %dnd humble number is ",n);        }        else if(t==3 && n%100!=13){            printf("The %drd humble number is ",n);        }        else{            printf("The %dth humble number is ",n);        }        printf("%I64d.\n",a[n]);    }    return 0;}

 

hdu 1058 Humble Numbers(构造?枚举?)