zoukankan      html  css  js  c++  java
  • Trailing Zeroes (III) LightOJ

    题意:

    You task is to find minimal natural number (N), so that (N!) contains exactly (Q) zeroes on the trail in decimal notation. As you know (N! = 1*2*...*N).For example, (5! = 120), (120) contains one zero on the trail.
    数据范围:(T ≤ 10^4,1 ≤ Q ≤ 10^8)

    分析:

    关键在于给定一个数 (n),如何求出 (n!)有多少个 (5)
    一开始想维护一个前缀和,来纪录 (n!) 的因子中有多少个 (5)。但是时间和空间的花费太多了。
    这里介绍一个定理:
    (f(x)) 表示 (x!) 中因子 (5) 的个数;

    [f(n!)=egin{cases} 0 & n<5\ k+f(k!) & k=frac{n}{5} end{cases}]

    推广到任意数 $x$,有 $$f(n!)=egin{cases} 0 & n 求阶乘,数肯定是连续的。那么先除 $x$,就把 $[1,n]$ 中含有至少一个因子 $x$ 的数的个数求出,再使 $n/x$。然后依次类推。 知道这个之后,我们直接二分就可以求出答案。 ### 代码:
    #include <bits/stdc++.h>
    using namespace std;
    const int N=4e8+100;
    int solve(int n)
    {
        int res=0;
        while(n)
        {
            res+=n/5;
            n/=5;
        }
        return res;
    }
    int main()
    {
        int t,q,cot=0;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&q);
            int l=4,r=N;
            while(l<=r)
            {
                int mid=(l+r)>>1;
                if(solve(mid)>=q)
                    r=mid-1;
                else
                    l=mid+1;
            }
            printf("Case %d: ",++cot);
            if(solve(l)==q)
                printf("%d
    ",l);
            else
                printf("impossible
    ");
        }
        return 0;
    }
    
    
  • 相关阅读:
    派生类的构造函数
    继承和派生
    自增自减运算符的重载(强制类型转换运算符重载)
    流插入和流提取运算符的重载
    动态数组类的设计
    函数的返回值
    赋值运算符的重载
    运算符重载
    常量对象函数引用和参数传递
    理解ASP.NET MVC的路由系统
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/12470051.html
Copyright © 2011-2022 走看看