#include <iostream>

using namespace std;

// 欧拉筛(线性筛)  1e8
// 原理:所有质数的倍数都是合数(1倍除外)
// 优化:相比埃氏筛,欧拉筛减少了大量的重复计算,从而效率更高

// 标记合数
int pri[100000005]; // pri[i] = 0,说明i是质数
int p[100000005];  // 存储质数
int cnt = 0;

// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// 0 0 0 0 1 0 1 0 1 1  1  0  1  0  1  1  1  0  1  0  1
// 2 3 5 7 11
int main() {
	int n,m;
	scanf("%d%d",&n,&m);
	// 正常从2开始找质数,一直找到n
	for(int i=2;i<=n;i++){
		// 如果是质数,把质数i放到p数组里面
		if(pri[i] == 0) p[++cnt] = i; 
		// 遍历每一个质数,去标记每个质数的倍数
		// 注意结束条件,p[i]*i不能超过n (数组不能越界) 
		for(int j=1;j<=cnt && p[j]*i<=n;j++){
			// 标记合数
			pri[ p[j]*i ] = 1;
			// 如果当前的i能被质数整除就结束循环
			if(i%p[j] == 0) break;
		}
	}
	return 0;
}

11 条评论

  • @ 2024-1-19 18:11:24

    #pragma GCC optimize(2) #include bool pri[100000005]; int p[6000005]; int cnt=0;

    int main(){ int n; scanf("%d",&n); for(int i=2;i<=n;i++){ if(pri[i]==0){ p[++cnt]=i; }

    for(int j=1;j<=cnt && p[j]*i<=n;j++){
    	pri[p[j]*i]=1;
    	if(i%p[j]==0) break;
    	}
    }
    printf("%d",cnt);
    return 0;
    

    }

    • @ 2024-1-19 18:03:58
      cin>>ss>>endl;
      
      • @ 2024-1-19 18:03:23

        这不是粗体

        • @ 2024-1-19 18:03:15

          ~~血色素奥哈拉👍 ~~

          • @ 2024-1-19 18:02:57

            EZS剖哦i是否会给并非uvu豆瓣vbois保持水平

            • @ 2024-1-19 18:02:49

              点测光i葛根粉v

              • @ 2024-1-19 18:02:44

                • @ 2024-1-19 18:02:39

                  • @ 2024-1-19 18:02:38
                    • @ 2024-1-19 18:02:35

                      反对

                      • @ 2024-1-19 18:02:32

                        来了!

                        • 1