您的位置:首页 > 大数据 > 人工智能

light oj 1138 - Trailing Zeroes (III)《《二分》》

2016-03-23 22:00 459 查看
D - D

Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu

Submit

Status

Description

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

直接打表会超内存,,,但是应该是正确的,,,,,,

是5的倍数就会加0,,是5的几次方就加几个0.。



二分,,,,,

打表代码:

#include<cstdio>
#include<cstring>
#define MA 100000000
int ge[100000100]={0};
int shu(int xx)
{
int li=0;
while (xx%5==0)
{
li++;
xx/=5;
}
return li;
}
int main()
{

int p=1;
for (int i=1;i<80000010;i++)
{
if (i%5==0)
{
p+=shu(i);
}
if (p>100000000)
{
//	printf("%d     11111111\n",i);
break;
}
ge[p++]=i*5;
}
int t,n;scanf("%d",&t);
for (int ca=1;ca<=t;ca++)
{
scanf("%d",&n);
if (ge
)
printf("Case %d: %d\n",ca,ge
);
else
printf("Case %d: impossible\n",ca);
}
return 0;
}


代码:

#include<cstdio>
int ge(int xx)
{
int li=0;
while (xx>4)
{
xx/=5;
li+=xx;
}
return li;
}
int main()
{
int ca,n,t;scanf("%d",&t);
for (ca=1;ca<=t;ca++)
{
scanf("%d",&n);
int qian,huo,i,left=0,right=400001000,shu,cen,s=0;
while (left<=right)
{
cen=(left+right)/2;
shu=ge(cen);
if (shu==n)
{
for (i=1;i<6;i++)//开始让i<5;;一直没找到错误<img alt="哭" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/cry.gif" />
{
if (ge(cen-i)!=n)
{
s=cen-i+1;
break;
}
}
break;
}
if (shu>n)
right=cen-1;
else
left=cen+1;
}
if (s==0)
printf("Case %d: impossible\n",ca);
else
printf("Case %d: %d\n",ca,s);
}
return 0;
}


继续二分,,,

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
LL n,le,ri,mid,ans,kp;
LL zhao(LL xx)
{
LL sk=0;
while (xx/5)
{
sk+=(xx/5);
xx/=5;
}
return sk;
}
int main()
{
int t;
scanf("%d",&t);//printf("gou   666\n");
for (int ca=1;ca<=t;ca++)
{
scanf("%d",&n);
//	printf("5d   6666666\n");
le=0;ri=10000000000;
ans=-1;
while (ri>=le)
{
mid=(ri+le)/2;
kp=zhao(mid);
if (kp==n)
{
ans=mid;
ri=mid-1;
}
else if(kp>n)
ri=mid-1;
else
le=mid+1;
}
if (ans==-1)
printf("Case %d: impossible\n",ca);
else
printf("Case %d: %d\n",ca,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: