小白进阶之路-51Nod 2652

题目:

错误思路:

  刚开始尝试使用Java大数打一下表,得到了一个错误规律,让我在WA了两天之后看着题解还是不明白。

  对比正确题解才知道在35之后我的规律错误了,给了我死刑,ok,换思路吧。。。

正确思路:

  二分,判断中间值 mid 是否满足 mid 的阶乘后的零的个数满足条件,满足就寻找更小值,不满足扩大寻找。

  难点在于如何判断一个数的阶乘后 0 的个数。思考过后明白,每个10都来自2和5,而某个数字的范围中2的个数一定多于5的个数。

  也就是说我要找到1 ~ mid 中5倍数的个数。

#include <cstdio>

#define ll long long
using namespace std;
ll l = 1,r = 1e18;
ll k ;


ll Zero(ll x) // 判断 5 的倍数的个数
{
    ll ans = 0,t = x;
    while(t){
        ans += t / 5;
        t /= 5;
    }
    return ans;
}

int main()
{
    scanf("%lld",&k);
    while(l < r - 1){ // 二分搜索
        ll mid = l + (r-l) / 2;
        if(Zero(mid) >= k){
            r = mid;
        }else{
            l = mid;
        }
    }
    printf("%lld
",r);
}
原文地址:https://www.cnblogs.com/Wise-XiaoWei4/p/12984184.html