数论全家桶

素数

1. 算术基本定理(唯一分解定理)

任何一个大于1的的整数都可以唯一表示为\(N=p_1^{c_1}p_2^{c_2}p_3^{c_3}\cdots p_m^{c_m}\)的形式

2.单个素数的判定

复杂度\(O(\sqrt{n})\)

bool check(int n) {
	for(int i=2;i*i<=n;i++) 
	if(n%i==0) return 0;
	return n<2?0:1;
}

3.多个素数的判定

埃氏筛
主要思想:遇到了一个素数就把这个素数的倍数筛掉,可能会有重复,时间复杂度\(O(nloglogn)\)

#define int long long
bool vis[N];
void shai(int n) {
	for(int i=2;i<=n;i++) {
		if(vis[i]) continue;
		for(int j=i;i*j<=n;j++) vis[i*j]=1; 
	}
}

线性筛
主要思想:每个合数只被它最小的质因子筛掉,保证每个合数只被筛掉一次,时间复杂度\(O(n)\)

#define int long long
bool vis[N];
vector<int>pr;
void shai(int n) {
	for(int i=2;i<=n;i++) {
		if(!vis[i]) pr.push_back(i);
		for(int j:pr) {
			if(i*j>n) break;
			vis[i*j]=1;
			if(i%j==0) break;
		}
	}
}
posted @ 2026-08-14 21:59  技技技技技  阅读(4)  评论(1)    收藏  举报