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 |
给出一个数Q,求阶乘的末尾有Q个零的最小数字N。
根据算数基本定理,N!可以被拆分成素数的幂的乘积的形式,N! = p1^r1 * p2^r2 * ... * pn^rn
,因为0就是由于数字中包含的因子10,而10 = 5 * 2,而N!中的2一定比5多,所以求零的个数等价于求5的次数。
题目中Q最大为1e8,这个对应的N大概是4e8,所以从1到5e8二分查找就可以了,因为零的个数一定是递增的。
AC代码:
#include<iostream>
#include<stdio.h>
using namespace std;
void solve(int n){
int l = 1,r = 5e8,temp,mid,cnt,mmin = 5e8;
while(l <= r){
cnt = 0;
mid = (l+r)/2;
temp = mid;
while(temp){
cnt += temp/5;
temp /= 5;
}
if(cnt == n){
mmin = min(mmin,mid);
r = mid - 1;
}
else if(cnt > n) r = mid - 1;
else if(cnt < n) l = mid + 1;
}
if(mmin != 5e8) cout<<mmin<<endl;
else cout<<"impossible"<<endl;
}
int main(){
int T,n,cnt = 1;
cin>>T;
while(T--){
cin>>n;
printf("Case %d: ",cnt++);
solve(n);
}
return 0;
}