#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;
}