版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jsszwc/article/details/82527357
题目
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010
题意
思路
首先枚举出所有满足条件且不超过 的数字,然后二分。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100000 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
const double PI = acos(-1);
LL arr[N];
int init(LL limit)
{
int index2 = 0, index3 = 0, index5 = 0;
int len = 0;
arr[0] = 1;
while(arr[len] <= limit)
{
arr[++len] = min({arr[index2]*2, arr[index3]*3, arr[index5]*5});
while(arr[index2]*2 <= arr[len]) ++index2;
while(arr[index3]*3 <= arr[len]) ++index3;
while(arr[index5]*5 <= arr[len]) ++index5;
}
return len;
}
int main()
{
int len = init(1e18 + 10);
int T;
LL n;
scanf("%d", &T);
while(T--)
{
scanf("%lld", &n);
printf("%lld\n", *lower_bound(arr+1, arr+len+1, n));
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100000 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
const double PI = acos(-1);
LL arr[N];
int init(LL limit)
{
int len = 0;
for(LL i = 1; i < limit; i *= 2)
{
for(LL j = 1; i*j < limit; j *= 3)
{
for(LL k = 1; i*j*k < limit; k *= 5)
arr[len++] = i*j*k;
}
}
sort(arr, arr + len);
return len;
}
int main()
{
int len = init(1e18 + 100);//注意,这里偷懒用了浮点数形式,但超过15位后精度损失很大,填1e18+10得出的是10^18,填1e18+100得出的18^18+128
//cout << arr[len-1] << endl;
int T;
LL n;
scanf("%d", &T);
while(T--)
{
scanf("%lld", &n);
printf("%lld\n", *lower_bound(arr+1, arr+len, n));
}
return 0;
}