hdu 5878 I Count Two Three(二分)
预处理所有满足值,排序后可二分查询。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e9;
int num;
map<LL,int>mp;
LL a[10000];
void init()
{
LL i,j,k,l;
num=0;
for(i=0;i<32;i++)
for(j=0;j<21;j++)
for(k=0;k<15;k++)
for(l=0;l<13;l++)
{
LL res=pow(2,i)*pow(3,j)*pow(5,k)*pow(7,l);
if(res<=1000000000&&!mp[res])
{
mp[res]=1;
a[num++]=res;
}
}
sort(a,a+num);
//printf("%d\n",num);
}
int main()
{
int T;
init();
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int left,right;
left=1,right=num-1;
while(left<right)
{
int mid=left+(right-left)/2;
if(a[mid]>=n)
right=mid;
else
left=mid+1;
}
printf("%lld\n",a[left]);
}
return 0;
}