暑期集训之Trailing Zeroes (III)

唉,先说下感受,其实发现现在很多都是看着别人的博客想思路了,基本上碰到一个题就不会做,碰到一个题就不会做,只有看半天别人的博客才能明白怎么做了,初学阶段比葫芦画瓢,但有时候感觉一直找葫芦搞得自己很惭愧,但不看又只能干瞪眼,总之走一步看一步吧,这东西还是得多练,毕竟现在每天接触的都是一些新的东西

You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the trail.

Input

Input starts with an integer T (≤ 10000), denoting the number of test cases.

Each case contains an integer Q (1 ≤ Q ≤ 108) in a line.

Output

For each case, print the case number and N. If no solution is found then print 'impossible'.

Sample Input

3

1

2

5

Sample Output

Case 1: 5

Case 2: 10

Case 3: impossible


这道题题的大致意思就是说,给你一个数q,q代表的是某个数N的阶乘的末尾0的个数,最后让你找出这个N,当然这道题因为数据量很大,所以一个一个的找肯定是实现不了的,所以用到了二分思想,当然今天的专题就是二分,话不多说,代码奉上,代码中有详细的解释:

#include<stdio.h>
long long cal(long long x)//这里是一个找出N!末尾有几个0的函数,当成模板记住就好了,原理的话在数学小知识里面有 
{
	long long p=0;
	while(x)
	{
		p=p+x/5;
		x=x/5;
	}
	return p;
}
int main()
{
	int n;
	scanf("%d",&n);
	int t=n;
	while(n--)
	{   
		long long q;
		long long l=0,r=500000000;//二分思想的话得有边界值,这个至目前算是最大的那个值了,再大就WA了 
		long long ans;//储存符合条件的N; 
		scanf("%lld",&q);
		while(l<=r)//二分经典模板,改下条件直接套用就好了 
		{
			long long mid=(r+l)/2;
			if(cal(mid)>=q) 
			{
				ans=mid;
				r=mid-1;
			}
			else
			l=mid+1;
		}
			if(cal(ans)!=q)//如果最后得出来的那个N!最后末尾0的个数和给的个数不等意味着这个数不存在,注意的是这里是cal(ans)和q比较的,因为ans是N,而cal(ans)才是0的个数 
			printf("Case %d: impossible\n",t-n);
			else
			printf("Case %d: %d\n",t-n,ans);//输出的时候输出所得的N就行了   
}
return 0;
 } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值