Problem Description
N! 后面有Q个0,问你第一个后面有Q个0的N!。输出N,找不到输出impossible
思路:
N! = p1^a1 * p2^a2 * … * pn^an。那么后面0的个数就是min(2的指数,5的次数)。由于2比5多,所以我们只考虑5。
100! 有几个0,100/5 = 20, 20/5 = 4, 4/5 = 0 所以100! 后有 20+ 4 = 24个0。
接着我们只需要二分答案即可
#include<bits/stdc++.h>
using namespace std;
int solve(int mid)//mid!后面几个0
{
int res = 0;
while(mid)
{
res += mid / 5;
mid = mid / 5;
}
return res;
}
int main()
{
int T, Case = 1, n, mid;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
int l = 1, r = 1000000000;
int flag = 0;
while(l <= r)
{
mid = (l + r) / 2;
int res = solve(mid);
if(res >= n)
{
r = mid - 1;
if(res == n) flag = 1;//代表肯定有解
}
else l = mid + 1;
}
if(flag)//有答案
printf("Case %d: %d\n", Case++, r + 1);
else printf("Case %d: impossible\n", Case++);
}
}