LightOJ 1138 Trailing Zeroes (III)

来源:互联网 发布:数据结构与算法知识点 编辑:程序博客网 时间:2024/06/05 17:06

题目分析

这道题刚开始拿到手中并没有什么好的想法,但是自己想一下会发现,n!我们会发现末尾含有0,说明相乘的时候必然可以拆分出2和5,同时是2的倍数明显比5的倍数多很多,那么我们找0的个数就等价于找5的个数,然后对于5的个数,我们通过二分是5的多少倍,同时我们需要求出是51,52,53,.....,5m的多少倍,累计即可。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define LL long longLL solve(LL x){    LL temp = 5;    LL ans = 0;    while(x/temp){        ans += x/temp;        temp *= 5;    }    return ans;}int main(){    int T, N;    scanf("%d", &T);    for(int kase = 1; kase <= T; kase++){        scanf("%d", &N);        LL l = 1, r = 1e8;        while(l < r){            LL mid = (l+r)/2;            if(solve(mid*5) >= N) r = mid;            else l = mid+1;        }        if(solve(r*5) != N) printf("Case %d: impossible\n", kase);        else printf("Case %d: %lld\n", kase, 5*r);    }    return 0;}
0 0