数论-质数 poj2689,阶乘分解
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论-质数 poj2689,阶乘分解相关的知识,希望对你有一定的参考价值。
//质数筛法 /*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,阶乘分解的主要内容,如果未能解决你的问题,请参考以下文章
POJ2689 Prime Distance(数论:素数筛选)