#4879. 2026/2/23/LH笔记(埃氏筛+二维前缀和)

2026/2/23/LH笔记(埃氏筛+二维前缀和)

当前没有测试数据。

#include<bits/stdc++.h>
using namespace std;
//1.前缀和作用:快速统计区间和
//2.差分作用:快速的进行区间修改操作
//素数的定义:如果某个数因数只有1和他本身 那这个数就是质数
//只有数字0代表假 其他全代表真
int ans;
// bool isP(int n){//prime
// 	if (n <= 1) return 0;
// 	for (int i = 2; i * i <= n; i++){
// 		if (n % i == 0) return 0;
// 	}
// 	return 1;
// }
const int N = 1e7 + 10;
bool isP[N];
//isP[i]=0说明数字i是质数
//isP[i]=1说明数字i不是质数
//素数筛
//质因数分解定理
//一个合数 一定可以分解成若干个质因数相乘
//N=a*b   1.a是质数 b是质数   35=5*7
//        2.a是合数 b是质数   70=10*7
//        3.a是合数 b是合数   60=6*10
//埃筛筛核心原理:抓到一个质数之后,就把范围内的这个质数的所有倍数
//标记成合数   
//使用埃氏筛 筛选1000w以内的质数 一点压力也没有
//如何快速的计算二维数组当中 某一段范围的总和???
//二维前缀和
//s[i][j]:a数组 前i行 前j列的总和 是s[i][j]
//s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]
//如何利用二维前缀和数组 快速的计算某一段范围的总和??
//假设有一个小矩形,左上角坐标是 (x,y) 右下角坐标是 (xx,yy)
//s[xx][yy]-s[xx][y-1]-s[x-1][yy]+s[x-1][y-1]
//如何枚举一个二维数组当中的所有小矩形???
//如果小矩形的左上角坐标和右下角坐标能够确定 那这个小矩形就能够确定
//所以只需要枚举小矩形左上角坐标和右下角坐标即可
// for(int x=1;x<=n;x++){
//     for(int y=1;y<=m;y++){
//         for(int xx=x;xx<=n;xx++){
//             for(int yy=y;yy<=m;yy++){
//                 //左上角坐标是(x,y) 右下角坐标是(xx,yy)
//             }
//         }
//     }
// }
signed main(){
	isP[1] = 1;
	isP[0] = 1;
	for (int i = 2; i <= 1e7; i++){
		if (isP[i] == 0){
			for (int j = 2; i * j <= 1e7; j++){
                ans++;
				isP[i * j] = 1;
			}
		}
	}
    cout<<ans;
	return 0;
}