码迷,mamicode.com
首页 > 其他好文 > 详细

数论-质数 poj2689,阶乘分解

时间:2019-01-06 21:54:04      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:col   阶乘   复杂度   prime   nbsp   size   span   质因数分解   超出   

//质数筛法
/*Era筛:
复杂度:O(nloglogn)非常接近线性
原理:任何质数x的倍数:2x,3x,...都是合数,优化后只要筛 >=x*x的数即可 
*/
void primes(int n){
    memset(v,0,sizeof v);//合数标记 
    for(int i=2;i<=n;i++){
        if(v[i]) continue;
        for(int j=i;i*j<=n;j++) v[i*j]=1; 
    }
} 

/*
线性筛
复杂度:O(n)
原理:每个数只被它最小的数筛一次 
*/
void primes(int n){
    memset(v,0,sizeof v);//每个数的最小质因子 
    memset(prime,0,sizeof prime);//质数集合 
    m=0;//质数数量
    for(int i=2;i<=n;i++){
        if(v[i]==0){//i是质数 
            v[i]=i;
            prime[++m]=i;
        }
        for(int j=1;j<=m;j++){
            if(prime[j]>v[i] || prime[j]*i<n) break;//如果i有比prime[j]小的质因子,或者超出n范围 
            v[i*prime[j]]=prime[j];//prime[j]是i*prime[j]的最小质因子 
        } 
    } 
} 

//质因数分解
/*
试除法
复杂度:O(sqrt(N))
原理:对于给定的n,枚举[2,sqrt(n)]中的每个数d,若n能整除d,则把n中所有的d除去 
*/ 
void divide(int n){
    memset(p,0,sizeof p);//n的质因子 
    memset(c,0,sizeof c);//个质因子的幂 
    m=0; 
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0){//i必定是质数 
            p[++m]=i,c[m]=0;
            while(n%i==0)n/=i,c[m]++;
        }
    }    
    if(n>1) p[++m]=n,c[m]=1;//n是质数 
} 

 

数论-质数 poj2689,阶乘分解

标签:col   阶乘   复杂度   prime   nbsp   size   span   质因数分解   超出   

原文地址:https://www.cnblogs.com/zsben991126/p/10230413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!