阶乘(factorial)

Description

n的阶乘定义为 n!=n(n1)(n2)1n! = n*(n-1)*(n-2)*……*1

n的双阶乘定义为 n!!=n(n2)(n4)2n!! = n*(n-2)*(n-4)*……*2 (n为偶数)或 n!!=n(n2)(n4)1n!! = n*(n-2)*(n-4)*……*1 (n为奇数)。

但是阶乘的增长速度太快了,所以我们现在只想知道 n!n!n!!n!! 末尾的 00 的个数。

Input

一个正整数 nn<=107n,n<=10^7

Output

两个整数,分别为 n!n!n!!n!! 末尾 00 的个数。 l两个整数之间用一个空格隔开。

Sample Input

10

Sample Output

2 1

HINT

【样例1解释】 10!=362880010!!=108642=384010! = 3628800, 10!! = 10*8*6*4*2=3840

【样例2解释】 5!=1205!!=531=155! = 120 , 5!! = 5*3*1=15

解题思路

证明

众所周知 要知道某一个数末尾的 00 的个数

就要知道其中有多少个 因数 1010

又因为 10=2510=2*5

所以 每出现一个 22 和一个 55 ,末尾就会多一个 00

而通常一个关于阶乘式子中 55 出现的次数比 22 出现的次数低

所以每有一个5,阶乘末尾就会多出来一个0(一些没有不会出现 22 的式子除外)

证毕 ..

而最稳妥的方法是计算式子里 2255 分别出现的次数,取最小

AC codeAC \ 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;
    }
}
posted @ 2021-06-22 21:53  蒟蒻orz  阅读(20)  评论(0编辑  收藏  举报  来源