Trailing Zeroes (III)
Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu
Description
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
3
1
2
5
Sample Output
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就是答案;
#include<iostream>
#include<cstdio>
using namespace std;
int getq(int x)
{
int q = 0;
while(x)
{
q += x / 5;
x /= 5;
}
return q;
}
void erfen(int n)
{
int l = 0 , r = 0x3f3f3f3f;
while(l <= r)
{
int mid = (l + r) / 2;
if(getq(mid) >= n)
r = mid - 1;
else
l = mid + 1;
}
if(getq(l) == n) printf("%d\n",l);
else printf("impossible\n");
}
int main()
{
int t,m,k = 1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&m);
printf("Case %d: ",k++);
erfen(m);
}
return 0;
}