zoukankan      html  css  js  c++  java
  • 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
    ",ans);
            else puts("impossible");
        }
        return 0;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    规矩与管理
    信息系统叫设施比叫工具更贴近本义
    让ansbile和docker愉快的在一起
    elasearch基础教程
    markdown语法
    python 实用pickle序列化
    python 解析配置文件
    ansible状态管理
    haproxy官方配置文档地址
    ansible操作模块相关
  • 原文地址:https://www.cnblogs.com/--560/p/4567859.html
Copyright © 2011-2022 走看看