• 小白进阶之路-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);
    }
  • 相关阅读:
    针对当前用户 对方法加锁
    二叉树
    return与析构续
    return与析构函数
    拷贝构造函数
    引用
    返回引用的函数值和参数的引用
    使用引用返回函数值
    邻接表--图 部分代码
    dec,hex and oct
  • 原文地址:https://www.cnblogs.com/Wise-XiaoWei4/p/12984184.html
Copyright © 2020-2023  润新知