素数筛

1.欧拉筛

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 typedef long long ll;
 5 const int MAXN=1000010;
 6 const int MAXV=50010;
 7 
 8 ll l,r;
 9 bool notprime[MAXN];   //表示i是否质数
10 ll primes[MAXN];   //存储第i个质数
11 int ans=0;
12 
13 int cnt=0;
14 void olaPrime()   //欧拉筛
15 {
16     for (int i=2;i<MAXV;i++)
17     {
18         if (!notprime[i])   primes[++cnt]=i;
19         for (int j=1;i*primes[j]<MAXV;j++)
20         {
21             notprime[i*primes[j]]=true;
22             if (i%primes[j]==0) break;
23         }
24     }
25     return;
26 }
27 
28 int main()
29 {
30     olaPrime();
31     cin>>l>>r;
32     if (l==1) l=2;   //l=1特判
33     for (int i=1;i<MAXN;i++) notprime[i]=false;   //init
34     for (int i=1;i<=cnt;i++)   //枚举每个素数进行筛选
35     {
36         ll p=primes[i];
37         ll start=max((l+p-1)/p*p,2*p);   //start为大于l且能被p整除的最小的数
38         for (ll j=start;j<=r;j+=p)
39         {
40             notprime[j-l+1]=true;   //筛选,区间平移
41         }
42     }
43     for (int i=1;i<=r-l+1;i++)   //统计素数个数
44     {
45         if (!notprime[i]) ans++;
46     }
47     cout<<ans<<endl;
48 
49     return 0;
50 }

2.埃筛(常用)

 1 const int MAXN=100010;
 2 bool primes[MAXN];   //表示i是否为质数
 3 void aiPrime()
 4 {
 5     for (int i=2;i<MAXN;i++) primes[i]=true;
 6     for (int i=2;i*i<MAXN;i++)   //判断改成i*i<MAXN
 7     {
 8         if (primes[i])
 9         {
10             for (int j=i*i;j<MAXN;j+=i) primes[j]=false;
11         }
12     }
13     return;
14 }

 

posted @ 2021-12-04 22:05  Hell0er  阅读(27)  评论(0编辑  收藏  举报