Description
n的阶乘定义为 n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ … … ∗ 1 n! = n*(n-1)*(n-2)*……*1 n!=n∗(n−1)∗(n−2)∗……∗1。
n的双阶乘定义为 n ! ! = n ∗ ( n − 2 ) ∗ ( n − 4 ) ∗ … … ∗ 2 n!! = n*(n-2)*(n-4)*……*2 n!!=n∗(n−2)∗(n−4)∗……∗2 (n为偶数)或 n ! ! = n ∗ ( n − 2 ) ∗ ( n − 4 ) ∗ … … ∗ 1 n!! = n*(n-2)*(n-4)*……*1 n!!=n∗(n−2)∗(n−4)∗……∗1 (n为奇数)。
但是阶乘的增长速度太快了,所以我们现在只想知道 n ! n! n! 和 n ! ! n!! n!! 末尾的 0 0 0 的个数。
Input
一个正整数 n , n < = 1 0 7 n,n<=10^7 n,n<=107
Output
两个整数,分别为 n ! n! n! 和 n ! ! n!! n!! 末尾 0 0 0 的个数。 l两个整数之间用一个空格隔开。
Sample Input
10
Sample Output
2 1
HINT
【样例1解释】
10 ! = 3628800 , 10 ! ! = 10 ∗ 8 ∗ 6 ∗ 4 ∗ 2 = 3840 10! = 3628800, 10!! = 10*8*6*4*2=3840 10!=3628800,10!!=10∗8∗6∗4∗2=3840
【样例2解释】
5 ! = 120 , 5 ! ! = 5 ∗ 3 ∗ 1 = 15 5! = 120 , 5!! = 5*3*1=15 5!=120,5!!=5∗3∗1=15
解题思路
证明
众所周知 要知道某一个数末尾的 0 0 0 的个数
就要知道其中有多少个 因数 10 10 10
又因为 10 = 2 ∗ 5 10=2*5 10=2∗5
所以 每出现一个 2 2 2 和一个 5 5 5 ,末尾就会多一个 0 0 0
而通常一个关于阶乘式子中 5 5 5 出现的次数比 2 2 2 出现的次数低
所以每有一个5,阶乘末尾就会多出来一个0(一些没有不会出现 2 2 2 的式子除外)
证毕 . . .
而最稳妥的方法是计算式子里 2 2 2 和 5 5 5 分别出现的次数,取最小
A C c o d e AC \ code AC code
#include <bits/stdc++.h>
using namespace std;
int n, t, cnt;
void js()
{
while (t)
{
t /= 5;
cnt += t;
}
}
signed main()
{
cin >> n;
t = n;
js();
cout << cnt;
if (n & 1) //等同于 n%2==1
{
cout << " 0";
return 0;
}
else
{
t = n / 2;
cnt = 0;
js();
cout << " " << cnt;
}
}