埃拉托斯特尼筛法(埃氏筛)
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=1e6+6;
int prime[maxn],num[maxn];
int t;
void Sieve(int n)
{
memset(num,1,sizeof(num));
num[1]=0;
for(int i=2; i<=n; i++)
{
if(num[i])
{
prime[t++]=i;
for(LL j=1LL*i*i; j<=n; j+=i)
if(num[j])
num[j]=0;
}
}
}
区间筛
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+5;
bool is_prime[maxn],is_prime_small[maxn];
ll prime[maxn];
ll prime_num;
//对区问[a,b)的整数执行筛法,is_prime[i - a] = true <=>i是素数
void segment_sieve(ll a,ll b){
prime_num=0;
for(int i = 0; (ll)i * i < b; i++) is_prime_small[i] = true;//对[2,sqrt(b)]进行初始化
for(int i=0;i<b-a;i++) is_prime[i]=true;
for(int i=2;(ll)i*i<b;i++)
{
if(is_prime_small[i])
{
for(ll j=2*i;(ll)j*j<b;j+=i)
is_prime_small[j]=false;
for(ll j =max(2LL,(a+i-1)/i)*i;j<b;j+=i)
is_prime[j-a]=false;
}
}
for(ll i=0;i<b-a;i++)
if(is_prime[i]) prime[prime_num++]=i+a;
}
欧拉筛
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=1e6+6;
int num[maxn],prime[maxn];
int p;
void Sieve(int n)
{
memset(num,1,sizeof(num));
num[1]=0;
for(int i = 2; i < n; i++)
{
if(num[i])
prime[p++] = i;
for(int j = 0; j < p && 1LL*i*prime[j] < n; j++)
{
num[i*prime[j]] = 0;
if(i % prime[j] == 0)
break;
}
}
}