ZCMU 1375 階乘的零 二分

2021-08-21 22:16:21 字數 1107 閱讀 1494

定義f(n)為n!的末尾零的個數,例如f(4)=0,f(5)=1。你的任務是對於乙個給定的的值x找出最小的n滿足f(n)=x。

多組測試資料,每組測試資料報含乙個正整數x(1<=x<=10^8)。

對於每組測試資料輸出對應的n,若沒有n滿足則輸出「no solution」。

2
10
這題一開始腦抽看成輸入n求其階乘末尾0的數目,於是迴圈將原數除五的倍數,將商相加。顯然就喜聞樂見的wa了,但是這個結論並不是沒有用的,我們也需要運用到。題目原意為給出乙個數讓我們找出階乘末尾零數目等於該數的最小數。

規律:若是階乘後面出現0,則必是5的倍數與偶數相乘得到。由於偶數數目必大於等於五及其倍數的數目,因此我們只需要把所有可能的數列出來並查詢就好了。

在本題的二分查詢中,下界為1,至於上界的求法,由於本題最大末尾0數為十的八次方個,因此我們可以確定,我們的上界為十的八次方即可,因為其本身便帶有相應數目的零,其階乘的零只多不少。我們對其進行二分,求出二分中點上數的階乘0的個數,此時便用到了開頭所說的方法。得出的0若是多了,說明數取大了,向左二分,少了則向右二分,等於則盡量向左二分找更小的數。

本題的二分有個需要注意的點,由開始的結論我們可以推出,我們得出的數也一定是個五的倍數,然而我們二分的結果有時並沒有給出乙個五的倍數,因此我們自行將其縮小至最近的五的倍數即可。

#include #include #include #include #include #include #include #include #include #include #include #include #define n 10000000000

#define ll long long

using namespace std;

ll find(ll number)

return count;}

int main()

if (num >= n)max = mid - 1;

else if (num < n)min = mid + 1;

}if (!flag)printf("no solution\n");

}return 0;

}

ZCMU1375 階乘的零(二分法)

定義f n 為n!的末尾零的個數,例如f 4 0,f 5 1。你的任務是對於乙個給定的的值x找出最小的n滿足f n x。多組測試資料,每組測試資料報含乙個正整數x 1 x 10 8 對於每組測試資料輸出對應的n,若沒有n滿足則輸出 no solution water problem 先說一下這一道題...

poj 1375 Intervals 圓的切線

題意 有一光源,被若干個圓摭住了,求地面上陰影 題解 利用向量旋轉求出切線與圓的兩個交點,根據兩點成線得出ax by c 0的直線,令y 0時,求出地面的座標,再合併有連線的陰影。如下 include include include include define eps 1e 8 using nam...

N的階乘 大數階乘

輸入n求n的階乘的準確值。input 輸入n 1 n 10000 output 輸出n的階乘 首先,要確定n的階乘的數字大概有多少位,這樣便於我們去選擇合適的演算法。階乘 當n 10000時,上式值為35660 已經向上取整 所以接受 include include include include ...