洛谷2388 阶乘之乘

题目链接

题解

可以知道阶乘$n!$中因子$p$的次数是

而末尾$0$的个数就要看因子$10$的次数,而$10$的次数要看$2$和$5$的次数。因为本题中容易看出$2$的次数远大于$5$的次数,所以只要算出后者即可。
这里我用了一点等差数列的技巧。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdio>
#define INF 2000000000
using namespace std;
typedef long long ll;
ll n;
void init(){
scanf("%lld", &n);
}
void solve(){
ll n5 = 0;
for(ll i = 5; i <= n; i *= 5){
ll clos = (n % i == i - 1) ? n : (n - (n + 1) % i);
n5 += ((clos + 1) / i - 1) * (clos + 1) / 2 + (n - clos) * (clos + 1) / i;
}
printf("%lld\n", n5);
}
int main(){
init();
solve();
return 0;
}