数论初探
文章目录
简单的数论问题
质数
埃氏筛
const int N = 100000 + 5;
bool prime[N];
void init(){
// 近似线性,复杂度O(nloglogn),也已经很小了
for(int i = 2; i < N; i ++)
prime[i] = true;
for(int i = 2; i*i < N; i ++){
// 注意i*i<N可以减少一多半的运算量
if(prime[i]){
for(int j = i*i; j < N; j += i){
// 从i*i开始就可以了
prime[j] = false;
}
}
}
}
欧拉筛
const int N = 100000 + 5;
bool prime[N];//prime[i]表示i是不是质数
int p[N], tot;//p[N]用来存质数
void init(){
// 线性筛,每个数只会被筛掉一次
for(int i = 2; i < N; i ++)
prime[i] = true;//初始化为质数
for(int i = 2; i < N; i++){
if(prime[i]) p[tot ++] = i;//把质数存起来
for(int j = 0; j < tot && i * p[j] < N; j++){
prime[i * p[j]] = false;
if(i % p[j] == 0) break;//保证每个合数被它最小的质因数筛去
}
}
}
每个数的质因数分解
const int N = 100000 + 5;
vector<int > prime_factor[N];
void init(){
int temp;
for(int i = 2; i < N; i ++){
if(prime_factor[i].size() == 0){
for(