#include<bits/stdc++.h>
using namespace std;
#define int __int128
int qpow(int a, int b){
int res = 1;
while(b){
if(b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
inline __int128 read(){
__int128 x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void write(__int128 x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
signed main(){
int n, i, j, k = 0;
n = read();
int now = 1;
while(now < n){
now *= 5;
k++;
}
int res = 0, res_even = 0, c = 1;
for(i = 1; i <= k; i++){
c *= 5;
if(c > n) break;
int x = n / c;
if(x == 0) break;
int tmp = x;
int cnt = n - n / c * c + 1;
res += c * (x - 1) * x / 2 + cnt * x;
if(x % 2 == 0){
res_even += (c / 2) * (x / 2 * x / 2);//不能写成(x * x / 4)!!!因为如果不能整除的话可能会出错,也不能写成(c / 2) * x / 2 * x / 2,后面是一个整体,得加括号
res_even += ((c + 1) / 2) * ((x - 1) / 2 * x / 2);//同理
res_even += (cnt + 1) / 2 * x;
}
else{
res_even += c / 2 * ((x - 1) / 2 * (x - 1) / 2);
res_even += (c + 1) / 2 * ((x - 1) / 2 * (x + 1) / 2);
res_even += (cnt) / 2 * x;
}
}
if(n % 2 == 0) write(res_even);
else write(res - res_even);
return 0;
}
求阶乘结果末尾有几个0(求5因子的数量)
最新推荐文章于 2024-06-11 20:37:13 发布