这个题首先第一个突破口是,从阶乘的角度来看,0的个数只由5贡献,因为2足够多。
第二点,n阶乘的所有数中5的个数由n除以5求和可得,这个太巧妙想不到。
然后就是二分寻找一个数n,使得5的个数等于q,由于0的个数是1e8,所以上限是5e8(由上面第二点知,5e8才有1e8个0)。
最后自己吐槽一下:二分是不可能会的,这辈子都不可能的QAQ
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
const int maxn=1e8+2;
int t,n;
int get_num(int x)
{
int num=0;
while(x)
{
num+=x/5;
x/=5;
}
return num;
}
int main()
{
scanf("%d",&t);
for(int i=1; i<=t; i++)
{
scanf("%d",&n);
printf("Case %d: ",i);
int l=1,r=500000000,mid;
int num;
while(l<r)
{
mid=l+(r-l)/2;
if(get_num(mid)<n) l=mid+1;
else r=mid;
}
if(get_num(l)==n) printf("%d\n",l);
else printf("impossible\n",i);
}
return 0;
}