题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010
题目:
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。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000) 第2 - T + 1行:每行1个数N(1 <= N <= 10^18)
Output
共T行,每行1个数,输出>= n的最小的只包含因子2 3 5的数。
打表然后二分查找。
#include <iostream>
#include<bits/stdc++.h>
#define N 11000
#define LL long long
using namespace std;
LL d[N];
void init()
{
d[0]=1;
int ta=0,tb=0,tc=0;
for(int i=1;i<=N;i++)
{
LL mmin=min(d[ta]*2,d[tb]*3);
mmin=min(mmin,d[tc]*5);
d[i]=mmin;
if(d[ta]*2==mmin) ta++;
if(d[tb]*3==mmin) tb++;
if(d[tc]*5==mmin) tc++;
}
}
LL _find(LL t)
{
int l=1,r=N;
while(l<r)
{
int mid=(l+r)>>1;
if(d[mid]==t) return d[mid];
if(d[mid]<t) l=mid+1;
else r=mid;
}
return d[r];
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
LL n;
scanf("%lld",&n);
cout<<_find(n)<<endl;
}
}