题解p2388 阶乘之乘
Posted -singercoder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解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;
}
以上是关于题解p2388 阶乘之乘的主要内容,如果未能解决你的问题,请参考以下文章