#HDU 1058 Humble Numbers

来源:互联网 发布:手机延时摄影软件 编辑:程序博客网 时间:2024/06/07 05:37

Humble Numbers

题意: 如果一个数的质因子只有2,3,5,7,那么这个数就叫“丑数”,下现在要求前5842个“丑数”。

分析: 根据质因子分解唯一,我们知道只需要将 1分别乘上2,3,5,7,然后将得到的数在进行这样子的操作,由于原数列是递增排列的,所以可以使用优先队列维护。(在HDU上打表用了97ms,但是Vj上貌似不让交这么长的代码)

代码如下:

#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <cctype>#include <fstream>#define INF 0x3f3f3f3f#define TEST cout<<"stop here"<<endl using namespace std;typedef long long ll;const ll mod = 1e9 + 7;ll num[5900];int main(){    std::ios::sync_with_stdio(false);    std::cin.tie(0);    /*    ofstream outfile;    outfile.open("data.txt");    ll j=1;    outfile<<"{"<<" ";    for(ll i=1;i<=2000000000;i++){        if(judge(i))            {outfile<< i << ','<<" ";j++;}        if(j==20){outfile<<endl;j=1;}    }    outfile<<"}"<<endl;    outfile.close();    */    ll tmp = 1;    priority_queue<ll, vector<ll>, greater<ll> > que;    int i = 1;    while(i<=5842){        que.push(1);        while(!que.empty()){            if(i>5842)                break;            tmp = que.top();            que.pop();            if(tmp!=num[i-1]){                num[i++] = tmp;                que.push(tmp*2);                que.push(tmp*3);                que.push(tmp*5);                que.push(tmp*7);            }         }    }    int n;    while(cin>>n && n){        if(n%10==1 && n%100 != 11)            printf("The %dst humble number is %lld.\n",n,num[n]);        else if(n%10==2 && n%100!=12)            printf("The %dnd humble number is %lld.\n",n,num[n]);        else if(n%10==3 && n%100!=13)            printf("The %drd humble number is %lld.\n",n,num[n]);        else            printf("The %dth humble number is %lld.\n",n,num[n]);    }    return 0;}
原创粉丝点击