题目描述
求 中末尾0的个数。
分析
首先需要解决的是 末尾0 的个数,我们记 :
中末尾0 的个数
那么原问题就变成了: , 记
我们接下来求阶乘末尾0的个数,即
求解
由于2*5的乘积就会产生一个0,而且5的倍数比2的倍数少,所以只需统计5的倍数的个数,这就是0的个数,
其中
不整除 5。那么显然,
的下整,同时
, 所以有
时间复杂度
求解
由于
全部累加,可得
每次找到一个最大的k,使得 , 剩余的项直接计算就好,因此总的时间复杂度
时间复杂度
code
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1000010
typedef unsigned long long uLL;
typedef long long LL;
uLL n;
uLL f(uLL k){
if(k< 5)return 0;
else return k/5 + f(k/5);
}
uLL S(uLL k){
uLL ret =0;
if(k < 5){
for(uLL i=1 ; i<=k ; ++i)
ret+= f(i);
return ret;
}else{
uLL t = k/5;
for(uLL i = 5*t; i <=k ; ++i) ret += f(i);
ret+= 5*(t-1)*t/2;
return ret+5*S(t-1);
}
}
int main(int argc, char const *argv[]) {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n;
std::cout << S(n) << '\n';
return 0;
}