题意:
给出一个非负整数
n
n
n ,求:
f
(
n
)
=
{
n
∗
f
(
n
−
2
)
n
≥
2
1
0
≤
n
≤
2
f(n)=\begin{cases} n*f(n-2)& {n\geq 2}\\ 1& {0\leq n\leq 2} \end{cases}
f(n)={n∗f(n−2)1n≥20≤n≤2
后缀零个数。
思路:
首先可以想到,如果 n n n 是一个奇数,由于 f ( n ) f(n) f(n) 的因数中没有 2 2 2 ,也就是说其后缀零的个数必定为零;
当
n
n
n 是一个偶数时,因子
2
2
2 的个数远远多于
5
5
5 的个数,因此只用观察后者即可。
观察到
f
(
n
)
=
2
∗
4
∗
…
…
(
2
∗
n
−
2
)
∗
(
2
∗
n
)
f(n)=2*4*……(2*n-2)*(2*n)
f(n)=2∗4∗……(2∗n−2)∗(2∗n) ,因此我们只用求出
n
!
n!
n! 中因子
5
5
5 的个数,即为最终后缀零的个数。
时间复杂度: O ( n ) O(n) O(n)
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
int n;
cin >> n;
if (n & 1)
cout << 0;
else {
n /= 2;
int res = 0;
while (n >= 5) {
n /= 5;
res += n;
}
cout << res;
}
return 0;
}