码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】p2388 阶乘之乘

时间:2020-07-08 19:44:32      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:ref   5*   传送门   i+1   数列   www   strong   一点   code   

原题传送门

题解一堆\(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\n",ans);
	return 0;
}

【题解】p2388 阶乘之乘

标签:ref   5*   传送门   i+1   数列   www   strong   一点   code   

原文地址:https://www.cnblogs.com/-SingerCoder/p/13268461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!