链接:LightOJ - 1138 Trailing Zeroes (III)
题意:
共 T    ( ≤ 10000 ) T\;(\le10000) T(≤10000)组测试数据,每组数据给出一个 Q    ( 1 ≤ Q ≤ 1 0 8 ) Q\;(1\le Q\le 10^8) Q(1≤Q≤108),要求出最小的正整数 N N N,使得 N ! N! N!的末尾恰有 Q Q Q个 0 0 0
分析:
N ! N! N!末尾有多少个 0 0 0取决于其因数有多少个 10 10 10,也就是说取决于质因数有多少 2 2 2和 5 5 5;
对于 N ! N! N!,质因数 2 2 2的个数肯定是大于 5 5 5的个数的,所以只需要 找 N ! N! N!的质因数分解有多少个 5 5 5,那么就等于 ∑ i = 1 N ! 5 i \displaystyle\sum_{i=1}\frac{N!}{5^i} i=1∑5iN!
寻找最小的 N N N只需要二分,若 MID ! ! ! 中 5 5 5的个数 < Q \lt Q <Q,则往大的找,否则尽量往小的找,最后一个 满足 5 5 5的个数 = Q =Q =Q的既是答案。
以下代码:
#include<bits/stdc++.h>
using namespace std;
int cal(int x) //计算x!中5的个数
{
if(x==0)
return 0;
return x/5+cal(x/5);
}
int main()
{
int T,Q,kase=0;
scanf("%d",&T);
while(T--)
{
scanf("%d",&Q);
int ans=0,temp;
int L=1,R=5e8,MID;
while(L<=R)
{
MID=(L+R)>>1;
temp=cal(MID);
if(temp==Q)
{
ans=MID;
R=MID-1;
}
else if(temp>Q)
R=MID-1;
else
L=MID+1;
}
if(ans)
printf("Case %d: %d\n",++kase,ans);
else
printf("Case %d: impossible\n",++kase,ans);
}
return 0;
}