zoukankan      html  css  js  c++  java
  • 【题解】p2388 阶乘之乘

    原题传送门

    题解一堆(O(n))算法真给我看傻了。

    考虑(10=2*5),因子2肯定更多,所以计算因子5的个数即可。


    从5到n这(n-5+1)个数的阶乘里面,都各自含有一个因子(5=1*5)

    从10到n这(n-10+1)个数的阶乘里面,都各自含有一个因子(10=2*5)

    故因子5的总个数为((n-5+1)+(n-10+1)+...+(n \% 5+1))

    不难发现这是一个等差数列,首尾项如上,项数为(n/5)


    然而这样并不对,因为我们只考虑到了含有一个因子5的情况,但像(25=5*5)这样含有两个因子5的情况,我们还得重复计算。

    因此,枚举我们要统计的因子i,并用上面等差数列的思想分别计算其个数,统计入答案即可。


    值得注意的一点:由于前面在因子(i=5)的时候,我们已经将(25=5*5)中的一个因子5统计入答案。

    因此当因子(i=25)的时候,只要统计剩余的一个因子5即可。

    时间复杂度(O(logn))

    #include<cstdio>
    
    #define ll long long
    
    using namespace std;
    
    int main()
    {
    //	freopen("in.in","r",stdin);
    	int n;
    	scanf("%d",&n);
    	ll ans=0;
    	for(int i=5;i<=n;i*=5)
    		ans+=(ll)((n-i+1)+(n%i+1))*(n/i)/2;
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    单例模式
    抽象类的作用和应用场景
    java内部类的作用
    java多线程
    IO流--与properties集合配合使用
    IO流--序列化流与反序列化流
    8 个必备的PHP功能开发
    CSS3 box-shadow:
    移动平台的meta标签-----神奇的功效
    Android Screen Monitor抓取真机屏幕
  • 原文地址:https://www.cnblogs.com/-SingerCoder/p/13268461.html
Copyright © 2011-2022 走看看