首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。