zoukankan      html  css  js  c++  java
  • 小白进阶之路-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);
    }
  • 相关阅读:
    nginx 学习
    java 数组转字符串(以逗号分隔开)
    索引命名规范
    java常见的设计模式
    java中的堆、栈浅解。
    Oracle忘记System密码怎么办?
    端口被占用,怎么解决?
    Spring Mvc学习之路
    svg了解一下
    推荐几款基于vue的使用插件
  • 原文地址:https://www.cnblogs.com/Wise-XiaoWei4/p/12984184.html
Copyright © 2011-2022 走看看