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示例
5 1 8 13 35 77
Output示例
2 8 15 36 80
代码
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 long 10 #define INF 1500000000000000000 11 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+
时间: 2024-10-08 10:50:53