代码改变世界

今日的我要超越昨日的我,明日的我要胜过今日的我;以创作出更好的代码为目标,不断地超越自己。...

51NOD 1010 只包含因子2 3 5的数(二分 + 预处理)

传送门

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
解题思路:
就是首先将所有的只含有2 3 5因子的数打一个表保存在一个数组里,然后二分查找第一个>=数组里的数,输出就行了。
上代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const LL INF = 1e18+100;///不能太小了
const int MAXN = 70*70*70;
LL a[MAXN];
int cnt = 0;
void Init()
{
    cnt = 0;
    for(LL i=1; i<INF; i*=2)///(注意i,j,k是LL的)
        for(LL j=1; j*i<INF; j*=3)
            for(LL k=1; i*j*k<INF; 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);
        printf("%lld\n",a[lower_bound(a+1,a+cnt+1,n)-a]);
    }
    return 0;
}
阅读更多
版权声明:编写不易,转载请注明出处,谢谢。 https://blog.csdn.net/qingshui23/article/details/51533649
文章标签: 二分
所属专栏: ITAK的ACM之路
上一篇Codefroces 675 B. Restoring Painting(数学推公式)
下一篇51NOD 1040 最大公约数之和(分析 + 欧拉函数)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭