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.
InputInput starts with an integer T (≤ 10000), denoting the number of test cases.
Each case contains an integer Q (1 ≤ Q ≤ 108) in a line.
For each case, print the case number and N. If no solution is found then print 'impossible'.
3
1
2
5
Case 1: 5
Case 2: 10
Case 3: impossible
题意:让你找出一个最小的a!的值中末尾的0的个数为n的数
思路:二分,因为末尾0的个数和5有关,所以每次找一个值都要看它的0是不是等于n
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
LL chazhao(LL n)//找出n!的末尾的0的个数
{
LL cnt=0;
while(n>=5)
{
cnt+=n/5;
n=n/5;
}
return cnt;
}
LL fun(LL n)
{
LL mind,left=0,right=500000000;//N!的结尾最多有1*10^8个0,因而high=500000000足够了。
while(left<=right)
{
mind=(left+right)/2;
if(chazhao(mind)>n)
{
right=mind-1;
}
else
left=mind+1;
}
right=right-(right%5);//把*转化,当前求得的right值,不是题目所要求的(满足限制条件:0的个数)最小数字,所以我们要把余数给减去才是最小的数
if(chazhao(right)==n)
return right;
else
return 0;
}
int main()
{
int t;
scanf("%d",&t);
int g=0;
while(t--)
{
++g;
LL n;
scanf("%lld",&n);
LL k=fun(n);
if(k!=0)
{
printf("Case %d: %lld\n",g,k);
}
else
{
printf("Case %d: ",g);
printf("impossible\n");
}
}
}