洛谷P2388题解

题目链接:https://www.luogu.com.cn/problem/P2388

众所周知,有一种算法叫暴力,我们很容易得出一个平方时间复杂的算法。

好了,步入正题:

思考:什么时候会在末尾出现“0”?

没错,一定是2和5这一对数字相乘才会出现0,而且有2的因子的数(2,4,6,8,10...),比有5的因子的数(5,10,15,20...)要来的多(显然),因此问题就转化成了求5的因子的个数,朴素算法时间复杂度为nlogn(log的底数为5,但可以忽略),过不了1e8的数据。

但是,阶乘有着“前缀积”的性质:只要一个数是5的倍数,那它后面的数(包括这个数)的5的因子个数都要加1

为了优化,我们可以枚举5的次方数,再算出它们的倍数,再进行操作。

code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long n,ans;//要long long
 4 int main(){
 5     cin>>n;
 6     for(int i=5;i<=n;i*=5)//枚举5的次方数
 7         for(int j=1;i*j<=n;++j)ans=ans+n-i*j+1;//枚举次方数的倍数,再进行操作(把这个倍数到n全部加上1)
 8     cout<<ans<<endl;
 9     return 0;
10 }

复杂度?O(logn*大常数)。

码字不易,点个赞吧QwQ

猜你喜欢

转载自www.cnblogs.com/-YueYang-/p/12632384.html