Trailing Zeroes (III)(lightoj 二分好题)
1138 - Trailing Zeroes (III)
Time Limit: 2 second(s) | Memory Limit: 32 MB |
You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the trail.
Input
Input starts with an integer T (≤ 10000), denoting the number of test cases.
Each case contains an integer Q (1 ≤ Q ≤ 108) in a line.
Output
For each case, print the case number and N. If no solution is found then print 'impossible'.
Sample Input |
Output for Sample Input |
3 1 2 5 |
Case 1: 5 Case 2: 10 Case 3: impossible |
题解:这道题要找末尾0的个数所需要的最小阶乘,因为想到10=2*5,然而2是很多数的质因数,数目要大于质因数5的数目,所以只考虑5的质因数的个数,便为末尾0的个数,所以
int q=0;
while(x){
q+=x/5;
x/=5;
}
这点便可以得出x!末尾0的个数;
用二分,从无穷大开始找,找到Q就是答案;
代码:
1 #include<stdio.h> 2 const int MAXN=0x3f3f3f3f;//这个要足够大才能找到10^8 3 int getq(int x){ 4 int q=0; 5 while(x){ 6 q+=x/5; 7 x/=5; 8 } 9 return q; 10 } 11 void erfen(int n){ 12 int l=0,r=MAXN; 13 while(l<=r){ 14 int mid=(l+r)>>1; 15 if(getq(mid)>=n)r=mid-1;//二分这点注意 16 else l=mid+1; 17 } 18 if(getq(l)==n)printf("%d\n",l); 19 else puts("impossible"); 20 } 21 int main(){ 22 int T,Q,flot=0; 23 scanf("%d",&T); 24 while(T--){ 25 scanf("%d",&Q); 26 printf("Case %d: ",++flot); 27 erfen(Q); 28 } 29 return 0; 30 }