N!的素因子分解

N! = p1^t1*p2^t2*…pi^ti…*pk^tk(其中p1,p2……pk是素数,1<N<= 10^6)

很明显我们首先要筛出小于等于n的所有素数

然后我们将n分成两部分考虑,

1)为某个素因子的倍数,2)不是这个因子的倍数

例如: f(n,2)

n!=(2*4*6*....n)*(1*3*5*.....*(n-1))

=2^(n/2)*(1*2*3*4*......n/2)*(1*3*5*..(n-1))  得到了

......

因此我们就得到了递推公式 对某个因子的次数 f(n,p) = f(n/p,p)+ n/p ;

下面这个还讲了关于这个问题的推广

http://www.cnblogs.com/openorz/archive/2011/11/14/2248992.html

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int maxn = 10000010;
int prime[maxn],cnt;
int ans[maxn];
bool is[maxn];

void init(int n)
{
    cnt=0;
    memset(is,1,sizeof(is));
    memset(ans,0,sizeof(ans));
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=n;i++){
        if(is[i]){
            prime[cnt++]=i;
            for(int j=i+i;j<=n;j+=i)
                is[j]=0;
        }
    }
}

int fen(int n,int p)
{
    if(n==0) return 0;
    return fen(n/p,p)+n/p;
}
int main()
{
    int n;
    while(~scanf("%d",&n)){
        init(n);
        for(int i=0;i<cnt;i++)
            ans[i]=fen(n,prime[i]);
        for(int i=0;i<cnt;i++)
            printf("%d^%d\n",prime[i],ans[i]);
    }
    return 0;
}
时间: 2024-10-18 05:28:04

N!的素因子分解的相关文章

python 素因子分解

在使用python解决问题之前,我们先说一下,什么是素因子分解 所谓素因子分解就是,先找这个数的所有约数(约数即:a%b == 0,也就是a可以被b整除) 例如:20的约数集合为 [1, 2, 5, 10, 20] 那么素因子分解呢? 就是从最小的素数约数开始除,也就是这个除数要满足两个条件,一是约数,二是素数 那么这里20的最小的素约数是2,所以我们从2开始除,并且一直除到不能被整出为止: num = 20 num = num / 2 num = 10(这里num依旧可以被2整除,所以再来一次

2-07. 素因子分解(20) (ZJUPAT 数学)

题目链接:http://pat.zju.edu.cn/contests/ds/2-07 给定某个正整数N,求其素因子分解结果,即给出其因式分解表达式 N = p1^k1 * p2^k2 *-*pm ^km. 输入格式说明: 输入long int范围内的正整数N. 输出格式说明: 按给定格式输出N的素因式分解表达式,即 N = p1^k1 * p2^k2 *-*pm ^km,其中pi为素因子并要求由小到大输出,指数ki为pi的个数:当ki==1即因子pi只有一个时不输出ki. 样例输入与输出: 序

[Introduction to programming in Java 笔记] 1.3.9 Factoring integers 素因子分解

素数 A prime is an integer greater than one whose only positive divisors are one and itself.整数的素因子分解是乘积等于此素数的集合.例如:3757208 = 2*2*2*7*13*13*397 public class Factors { public static void main(String[] args) { // Print the prime factors of N. long N = Lon

大素数判断和素因子分解【miller-rabin和Pollard_rho算法】

集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646396.html 传说中的随机算法. 效率极高. 可以对一个2^63的素数进行判断. 可以分解比较大的数的因子. 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<time

poj1881:素因子分解+素数测试

很好的入门题 先测试是否为素数,若不是则进行素因子分解,算法详见总结贴 miller robin 和pollard rho算法 AC代码 #include <iostream> #include<stdio.h> #include<algorithm> #include<math.h> using namespace std; long long ans; long long gcd(long long a,long long b) { return b?g

PAT 2-07 素因子分解(C语言实现)

PAT 2-07 素因子分解(C语言实现) PAT 2-07 素因子分解(C语言实现),有需要的朋友可以参考下. 题目说明: 给定某个正整数N,求其素因子分解结果,即给出其因式分解表达式 N = p1^k1* p2^k2*…*pm^km. 输入格式说明: 输入long int范围内的正整数N. 输出格式说明: 按给定格式输出N的素因式分解表达式,即 N = p1^k1* p2^k2*…*pm^km,其中pi为素因子并要求由小到大输出,指数ki为pi的个数:当ki==1即因子pi只有一个时不输出k

大素数判断和素因子分解(miller-rabin,Pollard_rho算法)

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include<iostream> #include<algorithm> using namespace std; //**************************************************************** // Miller_Rabin 算法进

Hrbust1328 相等的最小公倍数 (筛素数,素因子分解)

本文出自:http://blog.csdn.net/svitter/ 题意: 求解An 与 An-1是否相等. n分为两个情况-- 1.n为素数, 2.n为合数. =  =好像说了个废话..素数的时候,可以直接输出no,因为素数不可能和An-1相等.合数的时候,如果n是a^b次方,那么也是NO.原因很简单,之前数字的最小公倍数的n的因子次方数,不能超过n的次方数. //================================================================

HDU 3641 Treasure Hunting(阶乘素因子分解+二分)

题目链接:传送门 题意: 求最小的 ( x! ) = 0 mod (a1^b1*a2^b2...an^bn) 分析: 首先吧a1~an进行素因子分解,然后统计下每个质因子的指数,由于随着x的增大,质因子的个数是逐渐增加的 因此我们可以二分x,对x!进行素因子分解判断是否满足条件,然后求出最小的就可以了. 代码如下: #include <iostream> #include <cstring> #include <algorithm> #include <cstdi

ACdream 1084 寒假安排(阶乘素因子分解)

题目链接:传送门 分析: 求A(n,m)转化成k进制以后末尾0的个数.对k素因子分解,第i个因子为fac[i], 第i个因子的指数为num[i],然后再对n的对A(n,m)进行素因子分解,设count[i] 代表fac[i]对应的指数,ans = min{count[i]/num[i] } 代码如下: #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> u