套路题了,做到过好几次类似的,求N!对某个因子的贡献。这里要试出来右端点开到多少
const ll N = 4e8+50;
int t;
ll cot,img;
bool check(ll mid)//N!对因子5的贡献
{
cot = 0;
while (mid / 5)
{
cot += mid / 5;
mid /= 5;
}
if (cot >= img)return true;
return false;
}
int main()
{
cin >> t;
int c = 0;
while(t--)
{
ll ans,ans2;
scanf("%lld", &img);
ll l = 0, r = N;
while (l <= r)
{
ll mid = (l + r) / 2;
if (check(mid))
{
ans = mid;
ans2 = cot;//此时N!对因子5的贡献
r = mid-1;
}
else l = mid + 1;
}
if(ans2==img)printf("Case %d: %lld\n", ++c,ans);//有此贡献的阶乘
else printf("Case %d: impossible\n", ++c);
}
return 0;
}