题意:找出一个大于等于n的,能写成2^a*3^b*5^c*7^d的数。(a,b,c,d均大于等于0)
思路:打表+查找。
打表的时候直接a,b,c,d枚举出来4重循环,然后再剪枝,因为2^32>1e9,所以我们在枚举的时候a,b,c,d都枚举到32就可以了,剪枝是判断一下当我们枚举的乘在一起大于1e9的时候就直接break。
查找用lower_bound函数,本质是二分查找,不会t。
还有卡cin,cout,注意!
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6;
typedef long long ll;
ll a[N];
int con=0;
ll poww(ll a,int b){
ll res=1;
while(b){
if(b&1)res=res*a;
a=a*a;
b>>=1;
}
return res;
}
void init(){
con=0;
for(int d=0;d<32;d++){
if(poww(7,d)>1e9)break;
for(int c=0;c<32;c++){
if(poww(7,d)*poww(5,c)>1e9)break;
for(int b=0;b<32;b++){
if(poww(7,d)*poww(5,c)*poww(3,b)>1e9)break;
for(int r=0;r<32;r++){
ll num=poww(7,d)*poww(5,c)*poww(3,b)*poww(2,r);
if(num>1e9)break;
a[con++]=num;
}
}
}
}
sort(a,a+con);
}
void sove(){
ll n;
scanf("%lld",&n);
ll q=*lower_bound(a,a+con,n);
printf("%lld\n",q);
}
int main(){
int t;
scanf("%d",&t);
init();
while(t--){
sove();
}
return 0;
}