light_oj 1138 求阶乘后导零的个数

light_oj 1138  求阶乘后导零的个数

N - Trailing Zeroes (III)

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

Submit Status Practice LightOJ 1138

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;
}

时间: 2024-10-08 20:50:42

light_oj 1138 求阶乘后导零的个数的相关文章

[C++]LeetCode: 88 Factorial Trailing Zeroes (阶乘后导零)

题目: Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 思路: 我们要计算 N! 中有多少个后导0. 我们来找一下规律,考虑n!的质数因子.后缀0,只有可能是质因子2 * 质因子5得到.如果我们可以计算得到min{num(2), num(5)},就可以知道后导0的个数. 举例子: n = 5!

LeetCode 172. 阶乘后的零(Factorial Trailing Zeroes)

172. 阶乘后的零 LeetCode172. Factorial Trailing Zeroes 题目描述 给定一个整数 n,返回 n! 结果尾数中零的数量. 示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零. 示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数中有 1 个零. 说明: 你算法的时间复杂度应为 O(log n) . Java 实现 class Solution { // 递归思路 public static int trailingZe

计算n阶乘中尾部零的个数

写在前面 本来觉得问题挺容易的,不打算记录,谁知道一不小心,还真没做出来.最终凭借"朴实"的算法思想解决了问题,但是其中的曲折还真是汗颜.科学的思维指导确实必不可少,"野路子"的朴素的战斗理论不论是效率还是后续的算法演进都经不起考验. 这里只是记录一下自己最近两天对此问题的一些想法,目前只能说是解决了问题,并且满足题目要求.据说问题来自<编程之美>,以后刷书本的时候看到原题,如果需要补充的话,再来更新. And,开始吧~ 正文 题目 设计一个算法,计算出

LeetCode 172 Factorial Trailing Zeroes(阶乘后的零)(*)

翻译 给定一个整型n,返回n!后面的零的个数. 注意:你的解决方案应该在log时间复杂度内. 原文 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 分析 起初我看题目的时候没太注意,还以为就是求n这个数后面的零而已,虽然心想不会这么简单吧--就写了一份代码提交了,结果WA提示我5的话应该返回1,

【每天一题】LeetCode 172. 阶乘后的零

开源地址:点击该链接 题目描述 https://leetcode-cn.com/problems/factorial-trailing-zeroes 给定一个整数 n,返回 n! 结果尾数中零的数量. 示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零. 示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数中有 1 个零. 说明: 你算法的时间复杂度应为O(logn). 解题思路 最直接的解法就是先求出 n! 等于多少 然后计算尾数中零的数量,该方法的复杂度

LeetCode【172. 阶乘后的零】

最开始一看,就觉得挺简单,就是先算出阶乘的值,再除以10,如果%为0,count++,然后s=s/10,如果不为0,就直接输出. class Solution { public int trailingZeroes(int n) { int i; int s = 1; int count = 0; for(i = 1;i <= n;i++) { s = s*i; } while(s != 0) { if(s % 10 == 0) { count++; s = s / 10; } else { b

172 Factorial Trailing Zeroes 阶乘后的零

给定一个整数 n,返回 n! 结果尾数中零的数量.注意: 你的解决方案应为对数时间复杂度. 详见:https://leetcode.com/problems/factorial-trailing-zeroes/description/ class Solution { public: int trailingZeroes(int n) { int res=0; while(n) { n/=5; res+=n; } return res; } }; 参考:https://www.cnblogs.c

【leetcode 简单】第四十一题 阶乘后的零

给定一个整数 n,返回 n! 结果尾数中零的数量. 示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零. 示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数中有 1 个零. 说明: 你算法的时间复杂度应为 O(log n) . class Solution(object): def trailingZeroes(self, n): """ :type n: int :rtype: int """ count

LeetCode 172. 阶乘后的零

给定一个整数 n,返回 n! 结果尾数中零的数量. 示例 1: 输入: 3输出: 0解释: 3! = 6, 尾数中没有零. 示例 2: 输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零. 说明: 你算法的时间复杂度应为 O(log n) .算法:我们只需要考虑n!中有多少个5即可. class Solution { public: int trailingZeroes(int n) { return n<5?0:n/5+trailingZeroes(n/5); } }; 原文地