首页 > 代码库 > 51Nod 1010 只包含因子2 3 5的数 Label:None

51Nod 1010 只包含因子2 3 5的数 Label:None

K的因子中只包含2 3 5。满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15。
所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数。
例如:n = 13,S中 >= 13的最小的数是15,所以输出15。
 
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)第2 - T + 1行:每行1个数N(1 <= N <= 10^18)
Output
共T行,每行1个数,输出>= n的最小的只包含因子2 3 5的数。
Input示例
518133577
Output示例
28153680

代码

 1 #include<iostream>   2 #include<cstdlib>   3 #include<cstring>   4 #include<cstdio>   5 #include<algorithm> 6 #include<queue> 7 #include<map> 8 #include<vector> 9 #define ll long long10 #define INF 150000000000000000011 using namespace std;  12 13 struct cmp{bool operator()(ll a,ll b){return a>b;}};14 priority_queue<ll,vector<ll>,cmp> q;15 map<ll,int> m;16 17 ll a[1000005],M,p;18 19 void init_(){20     q.push(1);21     while(q.top()<INF){22         ll x=q.top();q.pop();23         a[p++]=x;24         if(!m.count(2*x)) {q.push(2*x);m[2*x]=1;}25         if(!m.count(3*x)) {q.push(3*x);m[3*x]=1;}26         if(!m.count(5*x)) {q.push(5*x);m[5*x]=1;}27     }28     29     //cout<<p<<endl;30     scanf("%d",&M);31 }32 33 void work(){34     while(M--){35         ll x;36         scanf("%lld",&x);37         38         printf("%lld\n",*lower_bound(a+1,a+p+1,x));39     }40 }41 42 int main(){  43 //    freopen("01.in","r",stdin);44     45     init_();46     work();47     48     fclose(stdin);fclose(stdout);return 0;49 }

做一个优先队列,用已经有的数生成更大的数

map去重,lower_bound二分加速

INF少打了一个0,不开心

 

技术分享

时间还算可以吧,我觉得主要是询问的时间,因为 计数器菌 表示这样的数在数据范围内只有1w+

 

51Nod 1010 只包含因子2 3 5的数 Label:None