题目链接: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