两种筛选素数的方法:埃式和欧拉筛法
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#define maxn 1050
using namespace std;
int a[maxn];
bool isprime[1000002];
int num[1000002];
//埃式筛选法 时间复杂度O(nlogn)
void is_prim(int n){
n++;
fill(isprime,isprime+n,1);
fill(num,num+n,0);
isprime[1]=0;
num[1]=0;
for(int i=2;i<n;i++){
if(isprime[i]){
num[i]=num[i-1]+1;
for(int j=2*i;j<n;j+=i){
isprime[j]=0;
}
}
else{
num[i]=num[i-1];
}
}
}
//欧拉筛法O(n)
vector<int> Prime(int n){
bool flag[n+1];//judge whether the number is prime(1 represent a prime,0 represent a non-prime
fill(flag,flag+n+1,1);
vector<int> prime;
int cnt=0;//the total number of primes
for(int i=2;i<=n;i++){
if(flag[i]){
prime.push_back(i);
cnt++;
}
for(int j=0;j<cnt;j++){//保证每个素数筛掉最小的合数
if(i*prime[j]>n) break;
flag[i*prime[j]]=0;
if(i%prime[j]==0) break;//exclude the non-prime number which is not minimum
}
}
return prime;
}