邝斌的ACM模板(素数)
2017-08-13 15:19
387 查看
本博客整理自邝斌的ACM模板
2.1、素数
2.1.1 素数筛选(判断
2.1.2 素数筛选(筛选出小于等于 MAXN 的素数)
2.1.3 大区间素数筛选(POJ 2689)
2.1、素数
2.1.1 素数筛选(判断
/* * 素数筛选,判断小于MAXN的数是不是素数。 * notprime是一张表,为false表示是素数,true表示不是素数 */ const int MAXN=1000010; bool notprime[MAXN];//值为false表示素数,值为true表示非素数 void init() { memset(notprime,false,sizeof(notprime)); notprime[0]=notprime[1]=true; for(int i=2; i<MAXN; i++) if(!notprime[i]) { if(i>MAXN/i)continue;//防止后面i*i溢出(或者i,j用long long) //直接从i*i开始就可以,小于i倍的已经筛选过了,注意是j+=i for(int j=i*i; j<MAXN; j+=i) notprime[j]=true; } }
2.1.2 素数筛选(筛选出小于等于 MAXN 的素数)
/* * 素数筛选,存在小于等于MAXN的素数 * prime[0] 存的是素数的个数 */ const int MAXN=10000; int prime[MAXN+1]; void getPrime() { memset(prime,0,sizeof(prime)); for(int i=2; i<=MAXN; i++) { if(!prime[i])prime[++prime[0]]=i; for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++) { prime[prime[j]*i]=1; if(i%prime[j]==0) break; } } }
2.1.3 大区间素数筛选(POJ 2689)
/* * POJ 2689 Prime Distance * 给出一个区间[L,U],找出区间内容、相邻的距离最近的两个素数和 * 距离最远的两个素数。 * 1<=L<U<=2,147,483,647 区间长度不超过1,000,000 * 就是要筛选出[L,U]之间的素数 */ #include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> using namespace std; const int MAXN=100010; int prime[MAXN+1]; void getPrime() { memset(prime,0,sizeof(prime)); for(int i=2; i<=MAXN; i++) { if(!prime[i])prime[++prime[0]]=i; for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++) { prime[prime[j]*i]=1; if(i%prime[j]==0)break; } } } bool notprime[1000010]; int prime2[1000010]; void getPrime2(int L,int R) { memset(notprime,false,sizeof(notprime)); if(L<2)L=2; for(int i=1; i<=prime[0]&&(long long)prime[i]*prime[i]<=R; i++) { int s=L/prime[i]+(L%prime[i]>0); if(s==1)s=2; for(int j=s; (long long)j*prime[i]<=R; j++) if((long long)j*prime[i]>=L) notprime[j*prime[i]-L]=true; } prime2[0]=0; for(int i=0; i<=R-L; i++) if(!notprime[i]) prime2[++prime2[0]]=i+L; } int main() { getPrime(); int L,U; while(scanf("%d%d",&L,&U)==2) { getPrime2(L,U); if(prime2[0]<2)printf("There are no adjacent primes.\n"); else { int x1=0,x2=100000000,y1=0,y2=0; for(int i=1; i<prime2[0]; i++) { if(prime2[i+1]-prime2[i]<x2-x1) { x1=prime2[i]; x2=prime2[i+1]; } if(prime2[i+1]-prime2[i]>y2-y1) { y1=prime2[i]; y2=prime2[i+1]; } } printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,y1,y2); } } }
相关文章推荐
- 邝斌的ACM模板(素数筛选和合数分解)
- 邝斌的ACM模板(后缀自动机)
- 邝斌的ACM模板(目录篇)
- 邝斌的ACM模板(KMP算法)
- 邝斌的ACM模板(字符串 HASH)
- 邝斌的ACM模板(整数拆分)
- 邝斌的ACM模板(扩展 KMP)
- 邝斌的ACM模板(求 A^B 的约数之和对 MOD 取模)
- 邝斌的ACM模板(Manacher 最长回文子串)
- 邝斌的ACM模板(莫比乌斯反演)
- 邝斌的ACM模板(Baby-Step Giant-Step)
- ACM模板 素数打表
- ACM模板——快速判断素数
- 邝斌的ACM模板(AC 自动机)
- 邝斌的ACM模板(扩展欧几里得算法(求 ax+by=gcd 的解以及逆元素))
- 邝斌的ACM模板(自适应 simpson 积分)
- 邝斌的ACM模板(求逆元)
- 邝斌的ACM模板(模线性方程组)
- 邝斌的ACM模板(划分树)
- 邝斌的ACM模板(随机素数测试和大数分解(POJ 1811) )