题意:
给你一个
,然后让你输出一个大于等于
的特定数字,特定数字是
这种形式的数字。
思路:
首先
的范围只有
,也就是说不大于
,至于3,5,7肯定比30小,所以我们可以四重循环
)预处理这些特定的数字,给他们设定个上界
,把他们放进set里,最后二分查找即可。
ll ak[8][31];
ll rt[] = {2,3, 5,7};
set<ll> st;
int main(){
for(int i = 0;i < 4;++i){
ak[rt[i]][0] = 1;
for(int j = 1;j <= 30;++j){
ak[rt[i]][j] = ak[rt[i]][j-1] *rt[i];
}
}
int t;
for(int i = 0;i <= 30;++i){
for(int j = 0;j <= 28; j ++){
for(int k = 0;k <= 26;++k){
for(int p = 0;p <= 24;++p){
ll a = ak[2][i],b=ak[3][j],c=ak[5][k],d=ak[7][p];
ll pt = N;
pt /= a;pt /= b;pt/=c,pt/=d;
if(pt == 0) break;
else st.insert(a*b*c*d);
}
}
}
}
scanf("%d",&t);
while(t --){
ll n;
scanf("%lld",&n);
printf("%lld\n",*st.lower_bound(n));
}
}