您的位置:首页 > 其它

邝斌的ACM模板(素数)

2017-08-13 15:19 387 查看
本博客整理自邝斌的ACM模板

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: