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

 

你可能感兴趣的:(li)