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;
}
上一篇: 牛客网——晾衣服(二分)
下一篇: 函数定义和调用