数论全家桶
素数
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;
}
}
}

浙公网安备 33010602011771号