51Nod 1010 - 只包含因子2 3 5的数(暴力+二分)

题目链接 http://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。
【输入格式】
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
第2 - T + 1行:每行1个数N(1 <= N <= 10^18)
【输出格式】
共T行,每行1个数,输出>= n的最小的只包含因子2 3 5的数。
【样例输入】
5
1
8
13
35
77
【样例输出】
2
8
15
36
80

【思路】
       直接暴力打出1e18以内所有的2,3,5的倍数的数字然后排序,然后二分查找答案,因为2^64就会超过1e18,所以简单的估算可知1e18范围内2,3,5的倍数的个数是不会超过64*64*64的,所以数组完全存的下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll inf = 1e18 + 500;
const int maxn = 1000050;

ll n;
ll a[maxn];

int main() {
    int cnt = 0;
    for (ll i = 1; i < inf; i *= 2) {
        for (ll j = 1; i*j < inf; j *= 3) {
            for (ll k = 1; i*j*k < inf; k *= 5) {
                a[cnt++] = i*j*k;
            }
        }
    }
    sort(a, a + cnt);
    int t;
    scanf("%d", &t);
    while (t--) {
        scanf("%lld", &n);
        ll ans = *lower_bound(a + 1, a + cnt, n);
        printf("%lld\n", ans);
    }
    return 0;
}
posted @ 2018-03-18 11:12  不想吃WA的咸鱼  阅读(86)  评论(0编辑  收藏  举报