素数筛
顾名思义,用来筛选素数。
这里介绍两种素数筛:
1.埃氏筛(埃拉托斯特尼筛法)
1 void ass()
2 {
3 memset(u,true,sizeof(u));//u[i]=true表示i是素数
4 for(int i=2; i<=1100000; i++)
5 {
6 if(u[i])
7 for(int j=2; j<=1100000; j++)
8 {
9 if(i*j>1100000) break;
10 u[i*j]=false;//素数×j(j>=2)一定是合数
11 }
12 }
13 }
2.欧拉筛
1 void olas()//su[]用来存素数的值
2 {
3 int i,j;
4 num=1;//num记录素数个数
5 memset(u,true,sizeof(u));//u[i]=true表示i是素数
6 for(int i=2;i<=1000000;i++)
7 {
8 if(u[i]) su[num++]=i;
9 for(int j=1;j<num;j++)
10 {
11 if(i*su[j]>1000000) break;//超出判定的范围
12 u[i*su[j]]=false;//因为素数×i(i>=2)一定是合数。
13 if(i%su[j]==0) break;//这个是欧拉筛减少时间开销的关键 14 }
15 }
16 }