欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-17 15:38:52
...

题目链接 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;
}
相关标签: 二分