【模板】埃式筛和欧拉筛(线性筛)
埃式筛:
基本思想:
从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的
代码模板:
//如果为素数,则对应位置为1 void Prime(){ for(int i = 2; i <= n;i++){ is_prime[i] = 1; } for(int i = 2; i <= n; i++){ if(is_prime[i]){ for(int j = 2; i*j <= n; j++){ is_prime[i*j] = 0; } } } }
欧拉筛(线性筛)
在埃式筛的基础上,让每个合数只被它的最小质因子筛选一次,达到不重复目的
int prime[1100000],primesize; bool isprime[11000000]; void Prime(int listsize) { memset(isprime,1,sizeof(isprime)); isprime[1]=false; for(int i=2;i<=listsize;i++) { if(isprime[i])prime[++primesize]=i; for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++) { isprime[i*prime[j]]=false; if(i%prime[j]==0)break; } } } //筛选出来的数存放在prime数组中,从下标1开始

浙公网安备 33010602011771号