NEFU 118 n!后面有多少个0 (n!的素因子幂问题)

n!后面有多少个0

Problem : 118

Time Limit : 1000ms

Memory Limit : 65536K

description


从输入中读取一个数n,求出n!中末尾0的个数。

input


输入有若干行。第一行上有一个整数m,指明接下来的数字的个数。然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000。

output


对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。

sample_input


3
3
100
1024

sample_output


0
24
253

思路:

n!的素因子分解中素数p的幂为: [n/p]+[n/p^2]+[n/p^3]+……

证明在http://www.cnblogs.com/openorz/archive/2011/11/14/2248992.html详述

从公式可以易看出n!的素因子p的幂随p增大而递减

对于此题,可以知道末尾的0只有素因子2*5产生,且2的幂一定比5大,所以产生0的个数等于(2,5)的匹配数,也就是5的素因子个数

用结论公式可以O(logn)解决。

//Accepted 820k 2ms C++ (g++ 3.4.3) 331
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int n;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int ans=0;
        int p=5;
        while(n/p) ans+=n/p,p*=5;
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-29 04:01:53

NEFU 118 n!后面有多少个0 (n!的素因子幂问题)的相关文章

NEFU 118 n!后面有多少个0【数论】

http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=118 求n!后面有多少个0(1<=n<=1000000000),显然,n!肯定存不下. 2*5=10,所以有多少个2*5就有多少个0,所以只须求n!中因子2和因子5的个数.根据结论有 f(2) = [ n / 2 ] + [ n / 4 ] + [ n / 8 ] + -- f(5) = [ n / 5 ] + [ n / 25 ] + [ n / 125 ] + --

nefu 118 n!后面有多少个0 算数基本定理,素数分解

n!后面有多少个0 Time Limit 1000ms Memory Limit 65536K description 从输入中读取一个数n,求出n!中末尾0的个数. input 输入有若干行.第一行上有一个整数m,指明接下来的数字的个数.然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000. output 对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数. sample_input 3 3 100 1024 sample_output 0 24 253 考

数论 - 算数基本定理的运用 --- nefu 118 : n!后面有多少个0

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php Mean: 略. analyse: 刚开始想了半天都没想出来,数据这么大,难道是有什么公式? 首先我们要知道一点:n!里面所有的0都是2*5得来的,而且不管怎样2的数量一定是>5的数量,所以我们只需要考虑有多少个5就可. 后面也是看了解题报告才知道有这么一个结论. 这是算数基本定理的一个结论: n!的素因子分解中的素数p的幂为:[n/p]+[n/p^2]+[n/p^3]+... 知道这

nefu 118 n!后面有多少个0(算数基本定理)

题意:从输入中读取一个数n,求出n!中末尾0的个数. 思路:阶乘后的数很大,不可能直接计算的,对于任意一个正整数,若对其进行因式分解,那么其末尾的0必定可以分解为2*5,在这里,每一个0必然和一个因子5对应,但是注意,一个数的因式分解中的因子5不一定对应着一个0,因为还需要一个2呢,对于n!,在饮食分解中,2的因子个数要大于5的因子个数,所以如果存在一个因子5,那么它必然对应着n!末尾的一个0,本题便变为了 求 因子5的个数,有因为5是素数,所以可以用到算术基本定理的 n!的素数因子分解中的素数

N的阶乘末尾有多少个0

N的阶乘(N!)中的末尾有多少个0? N的阶乘可以分解为: 2的X次方,3的Y次方,4的5次Z方,.....的成绩.由于10 = 2 * 5,所以M只能和X和Z有关,每一对2和5相乘就可以得到一个10,于是M = MIN(X,Z),不难看出X大于Z,因为被2整除的频率比被5整除的频率高的多. 要计算Z,最直接的方法就是求出N的阶乘的所有因式(1,2,3,...,N)分解中5的指数.然后求和 1 int fun1(int n) 2 { 3 int num = 0; 4 int i,j; 5 6 f

编程之美3——N!末尾有多少个0

因为n!是一个非常大的数,所以不能通过常规的方法,求出n!的值之后,再判断它的末尾有多少个0. 这里的关键就是,n!的末尾有多少个0,取决于n!中,质因数 5 的个数. 如:12!=479001600    ,其中,5.10各含有1个质因数5,所以12!末尾有2个0 代码1: #include <iostream> using namespace std; int main(void) { int n,i,j,m; m=0; cin>>n; for(i=1;i<=n;i++)

求n! 末尾有多少个0

其实是求1到n 每个数的最小质因子有多少个5,有多少个5就有多少个0,因为2的个数明显大于5的个数 #include<iostream> using namespace std; int judge(int i){//计算i的最小质因子里有几个5 int cou=0; while(i%5==0){ cou++; i/=5; } return cou; } int main(){ int n; while(cin>>n){ int cou=0; int ans=0; for(int

求N!中末尾有多少个0

分析: 对N进行质因数分解 N=2^x * 3^y * 5^z...,由于10 = 2*5,所以末尾0的个数只和x与z有关,每一对2和5相乘可以得到一个10,于是末尾0的个数=min(x,z).在实际中x是远远大于z的,所以我们只要求出z的值即可. 根据公式 z = N/5 + N/5^2 + N/5^3+...+N/5^k 这表明,5的倍数贡献了一个5,5^2的倍数又贡献了一个5.... 比如:25其实是贡献了2个5,但是在N/5中已经贡献了一个,所以在N/5^2中再贡献一个:同样,125在N

从“n!末尾有多少个0”谈起

在学习循环控制结构的时候,我们经常会看到这样一道例题或习题.问n!末尾有多少个0?POJ 1401就是这样的一道题. [例1]Factorial (POJ 1401). Description The most important part of a GSM network is so called Base Transceiver Station (BTS). These transceivers form the areas called cells (this term gave the