light_oj 1138 求阶乘后导零的个数

light_oj 1138  求阶乘后导零的个数

N - Trailing Zeroes (III)
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

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

题意:给定n,求后导零个数为n的阶乘q!,输出q,不存在则输出“impossible";

思路:后导零,就是找2和5,由于5比2多所以直接找5,q!中有多少个因子5即有多少个后导零,每个5的倍数贡献一个后导零,每个25的倍数多贡献一个后导零,每个5^3又多贡献一个后导数零,以此类推.....阶乘q!后导零个数即为f(q)=q/5+q/25+q/125+.....。 然后二分解函数f(x)=n即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<math.h>
#include<cctype>

using namespace std;

typedef long long ll;
const int maxn=1000100;
const ll INF=(1<<29);
const double EPS=0.0000000001;
const double Pi=acos(-1.0);

ll n;

ll f(ll x)
{
    ll res=0,t=5;
    while(t<=x){
        res+=x/t;
        t*=5;
    }
    return res;
}

ll bin_search(ll left,ll right,ll key)
{
    while(left<=right){
        ll mid=(left+right)/2;
        if(f(mid)==key&&f(mid-1)<key) return mid;
        else if(f(mid)<key) left=mid+1;
        else right=mid-1;
    }
    return -1;
}

int main()
{
    int T,tag=1;
    cin>>T;
    while(T--){
        cin>>n;
        ll ans=bin_search(1,INF,n);
        printf("Case %d: ",tag++);
        if(ans!=-1) printf("%lld\n",ans);
        else puts("impossible");
    }
    return 0;
}
View Code

 

posted @ 2015-06-11 00:10  __560  阅读(773)  评论(0编辑  收藏  举报