素数
线性素数筛:O(nlogn)
bool check[100005];
int prime[100005];
void getprime(int n)
{
memset(check, 0, sizeof(check));
int tot = 0;
for (int i = 2; i <= n; ++i) {
if (!check[i]) {
prime[++tot] = i;
}
for (int j = 1; j <= tot; ++j) {
if (i * prime[j] > n) {
break;
}
check[i * prime[j]] = 1;
if (i % prime[j] == 0) {
break;
}
}
}
埃氏素数筛:O(nloglogn)
vector<int>prime;
bool is_prime[MAXN]
void find_prime(int n)
{
int p=0;
for(int i=2;i<=n;i++)
is_prime[i]=true;
is_prime[0]=is_prime[1]=false;
for(int i=2;i<=n;i++)
{
if(is_prime[i])
{
prime.push_back(i);
for(int j=2*i;j<=n;j+=i)
is_prime[j]=false;
}
}
}
区间素数模板
const int maxn=1e6;
ll prime[maxn+10];
ll prime2[maxn+10];
bool notprime[maxn+10];
bool bignotprime[maxn+10];
bool prime(ll x)
{
if(x==0||x==1||x==2) return false;
for(int i=2;i*i<=x;i++)
if(x%i==0) return false;
return true;
}
void getnotprime()
{
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;
for(int j=2*i;j<maxn;j+=i)
notprime[j]=true;
}
}
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;
}
}
}
void getprime2(ll L,ll R)
{
memset(bignotprime,false,sizeof(bignotprime));
if(L < 2) L = 2;
for(ll i=1;i<=prime[0]&&(long long)prime[i]*prime[i]<=R;i++)
{
ll pp=L/prime[i]+(L%prime[i]>0);
if(pp==1)pp=2;
for(ll j=pp;(long long)j*prime[i]<=R;j++)
if((long long)j*prime[i]>=L)
bignotprime[j*prime[i]-L]=true;
}
prime2[0]=0;
for(ll i=0;i<=R-L;i++)
if(!bignotprime[i])
prime2[++prime2[0]]=i+L;
}
int main()
{
ll a,b;
prime(x);
getprime();
getnotprime();
getprime2(a,b);
}