这题,一开始我通过打表找规律,后面WA了几发,发现应该不是那么做。
然后开始分析,0是怎么出现的?
10!两个0?101出一个,52出一个。
15!三个0?154出一个,101出一个,52出一个。
到这里不难发现了,只要在乘法中,出现5的倍数就会让0躲起来,那么多多少个呢?那当然是5的个数,为什么?
因为例如25! 25可以拆成55,那这两个5去寻找任意的因数都能出1个零,所以我们只要找5的因子个数就好了。
怎么找?
【数论:[N/5]+[N/5 ^ 2 ] +[N/5 ^ 3]+[N/5^4]+…】这里是为什么呢?
分析一个,求5的因子,有可能含有两个5,那么我们就要求n/5=5的个数。n/25=25的个数,n/125=125的个数,全部加起来,就是5的因子个数了。
int tj(int x)
{
int ans=0;
while(x)
{
ans+=x/5;
x/=5;
}
return ans;
}
然后再二分查找5的个数,复杂程度O(logn)
int brinary_search(int n)
{
ll l,r,m;
l=1;r=maxn;
while(l<=r)
{
m=(l+r)>>1;
if(tj(m)<n)
l=m+1;
else
r=m-1;
}
if(tj(l)==n)return l;
else return 0;
}
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
ll x;
scanf("%lld",&x);
if(brinary_search(x)!=0)
printf("Case %d: %d\n",cas,brinary_search(x));
else
printf("Case %d: impossible\n",cas);
}
}