b. Suffix Zeroes
生活随笔
收集整理的這篇文章主要介紹了
b. Suffix Zeroes
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
b: Suffix Zeroes
Time Limit: 1 Sec??Memory Limit: 128 MBDescription
這個游戲超休閑的~。現在你需要找一個自然數n,你找的自然數需要滿足n!的末尾恰好有k個0(當然我們都是十進制下的數,n! = 1*2*3*…*n)。比如:5!= 120,尾部恰好有一個0。
Input
?先輸入T,代表有T組數據(T ≤10000)
接下來的T行每一行都包括一個數字k(1≤k≤108)。具體含義請見題意。
Output
?如果能找到這樣的數,請輸出滿足條件的最小的自然數n,如果不存在這樣的自然數,請輸出impossible。
Sample Input
2 1 5Sample Output
Case 1: 5 Case 2: impossible我們發現末尾有一個0就代表有一個因數10,那么有多少個0就可以分解出多少個10,而10=2*5,顯然當n>=5時,n!中可以分解出的2的數量是比5多的,所以這題就變成求n!能分解出多少個5。
通過找規律很容易發現,能分解出5的數量為n/5+n/(5^2)+n/(5^3)+……,因此容易證明答案不超過5e8,直接二分答案即可。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define rd(a) scanf("%d",&a) 5 #define rep(i,a,b) for(int i=(a);i<=(b);i++) 6 int calc(int x){ 7 int cnt=0; 8 int a=5; 9 while(x>=a){ 10 cnt+=x/a; 11 a*=5; 12 } 13 return cnt; 14 } 15 int main(){ 16 int T; 17 rd(T); 18 rep(tt,1,T){ 19 int k; 20 rd(k); 21 int L=1,R=5e8; 22 while(R-L>1){ 23 int mid=L+R>>1; 24 if(calc(mid)>=k)R=mid; 25 else L=mid; 26 } 27 printf("Case %d: ",tt); 28 if(calc(R)==k)printf("%d\n",R); 29 else puts("impossible"); 30 } 31 } View Code
?
?轉載于:https://www.cnblogs.com/KafuuMegumi/p/10090773.html
總結
以上是生活随笔為你收集整理的b. Suffix Zeroes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [USACO1.4]等差数列 Arith
- 下一篇: (6)组合