階乘(factorial)


Description

n的階乘定義為 n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ … … ∗ 1 n! = n*(n-1)*(n-2)*……*1 n!=n(n1)(n2)1

n的雙階乘定義為 n ! ! = n ∗ ( n − 2 ) ∗ ( n − 4 ) ∗ … … ∗ 2 n!! = n*(n-2)*(n-4)*……*2 n!!=n(n2)(n4)2 (n為偶數)或 n ! ! = n ∗ ( n − 2 ) ∗ ( n − 4 ) ∗ … … ∗ 1 n!! = n*(n-2)*(n-4)*……*1 n!!=n(n2)(n4)1 (n為奇數)。

但是階乘的增長速度太快了,所以我們現在只想知道 n ! n! n! n ! ! n!! n!! 末尾的 0 0 0 的個數。

Input

一個正整數 n , n < = 1 0 7 n,n<=10^7 nn<=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!=362880010!!=108642=3840

【樣例2解釋】
5 ! = 120 , 5 ! ! = 5 ∗ 3 ∗ 1 = 15 5! = 120 , 5!! = 5*3*1=15 5!=1205!!=531=15

解題思路

證明

眾所周知 要知道某一個數末尾的 0 0 0 的個數

就要知道其中有多少個 因數 10 10 10

又因為 10 = 2 ∗ 5 10=2*5 10=25

所以 每出現一個 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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM