51nod1010只包含因子2.3.5的数

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010

1010 只包含因子2 3 5的数 

基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题

 收藏

 关注

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的数。

Input示例

5
1
8
13
35
77

Output示例

2
8
15
36
80

提示二分......毫无头绪,看网上先打表才恍然大悟.......


#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 50050;
ll a[N];
int cnt = 0;
const ll maxn = 1e18+999;
void init()
{
    ll i, j, k;
    for(i = 1; i < maxn; i*=2)
        for(j = 1; i*j < maxn; j*=3)
            for(k = 1; k*j*i < maxn; k*=5)
                a[cnt++] = i*j*k;
}
int main()
{   init();
    sort(a,a+cnt);
    int  T;
    cin>>T;
    while(T--)
    {
        ll n;
        scanf("%lld", &n);
        ll l = 1, r = cnt, mid;
        while(l<r)
        {
            mid = (l+r)>>1;
            if(a[mid] >= n)
            {
                r = mid;
            }
            else l = mid+1;
        }
        printf("%lld\n", a[l]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41453511/article/details/81333713