1. 程式人生 > >求階乘後綴0個數【二分】+【數學】

求階乘後綴0個數【二分】+【數學】

solution return == 根據 scan 容易 只需要 內存 會有

題目鏈接:http://www.bjfuacm.com/problem/374/

星球引力

發布時間: 2018年4月18日 17:36 最後更新: 2018年4月18日 17:39 時間限制: 1000ms 內存限制: 128M

某天,小A獲得在太空某星球旅遊的機會。這個星球很奇怪,它的引力根據每個人的重量計算的。例如,當小A的體重為5時,則星球對小A的引力為5!後包含0的個數,即5!=5×4×3×2×1=120,那麽星球對小A的引力為1。現在,小A想考考你,是否有這樣一個人,當其體重為數n時(n為自然數),使得其受到的引力為m,如果存在多個數n,則輸出最小的一個。

輸入包含多組。輸入一個數m(0<=m<=10^8)

每個輸出占一行,如果存在,則輸出最小的n,如果不存在,則輸出"No solution"。

2
10

解題思路:

這題需要一點數學知識,例如5!後包含0的個數,2*5是包含一個0的,那麽2,4也包含2,所以2的個數是夠的,所以
我們只需要知道5的個數就行了
比如100!後面包含多少個0呢?
每隔5,會有一個0,例如:5,10,15,20... //因為每隔5,2的個數是夠的,至少有一個數能夠提出一個2,與5想乘形成一個後綴0,下面的類似


每隔25,會多出一個0,因為25=5*5,例如:25,50,75...
每個125,也會多出一個0...
依次類推,可以發現,100!後包含的0的個數就是100/5+100/25=24個
如果這裏能理解,就很容易懂了。考慮1e9!後面0的個數是大於10^8,所以,我們只需要在5~1e9之間二分就可以了
當然,還可以縮小範圍來優化解法。

 
#include<cstdio>
int cal(int num)
{
    int sum = 0;
    while (num)
    {
        sum += num / 5;
        num /= 5;
    }
    return sum;
}
int
find(int l, int r, int m) { int mid; while (l<r) { mid = l + r >> 1; int pnum = cal(mid); if (pnum<m) l = mid + 1; else r = mid; } if (cal(l) != m) return -1; return l; } int main() { int m; while (scanf("%d", &m) != EOF) { if (m == 0) { printf("1\n"); continue; } int cnt = find(5, 1000000000, m); cnt == -1 ? printf("No solution\n") : printf("%d\n", cnt); } return 0; }


2018-04-19

求階乘後綴0個數【二分】+【數學】