暴力打表,把1e10内的符合要求的数都打出来,再二分查找
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll a[N];
int main()
{
int cnt=0;
ll s2=1,s3=1,s5=1,s7=1;
for(int i=0;i<32;i++)
{
if(i!=0) s2*=2;
else s2=1;
for(int j=0;j<20;j++)
{
if(j!=0) s3*=3;
else s3=1;
if(s2*s3>1e10) continue;
for(int k=0;k<14;k++)
{
if(k!=0) s5*=5;
else s5=1;
if(s2*s3*s5>1e10) continue;
for(int l=0;l<12;l++)
{
if(l!=0) s7*=7;
else s7=1;
if(s2*s3*s5*s7>1e10) continue;
a[cnt++]=s2*s3*s5*s7;
}
}
}
}
sort(a,a+cnt);
int T;
ll n;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
int p=lower_bound(a,a+cnt,n)-a;
printf("%lld\n",a[p]);
}
return 0;
}