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。
第2 - T + 1行:每行1个数N(1 <= N <= 10^18)
5 1 8 13 35 77
2 8 15 36 80
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxt 1e18+1000
using namespace std;
typedef long long ll;
ll arr[51000];
int cnt=0;
void init(){
for(ll i=1;i<=maxt;i*=2)
for(ll j=1;i*j<=maxt;j*=3)
for(ll k=1;i*j*k<=maxt;k*=5)
arr[cnt++]=i*j*k;
}
ll solve(ll n){
int head=1,tail=cnt;
while(head<=tail){
int mid=(head+tail)/2;
if(arr[mid]<n) head=mid+1;
else tail=mid-1;
}
return arr[head];
}
int main(){
int T;
scanf("%d",&T);
init();
sort(arr,arr+cnt);
while(T--){
ll n;
scanf("%lld",&n);
printf("%lld\n",solve(n));
}
return 0;
}