分解质因数
前言
起因是这道题:https://codeforces.com/contest/1766/problem/D
里面需要对$ abs(a-b) $ 分解质因数
但是如果用$ O(\sqrt{n} ) $ 遍历所有质数会TLE
所以需要用到分解质因数,时间复杂度$ O(log n ) $
当然还有一点: $ gcd(a,b)=gcd(a,a-b) $
欧拉筛分解质因数
思想
每个数都应由它的最小质因数标记
代码:
not_prime[1]=true;
min_fac[1]=1;
for(ll i=2;i<=n;i++){
if(min_fac[i]==0){ //是质数(替换成!not_prime[i]也行)
prime.push_back(i); //加入质数数组
min_fac[i]=i; //最小质因数标记为自身
}
for(ll j=0;i*prime[j]<=n && j<prime.size();j++){
not_prime[i*prime[j]]=true;
min_fac[i*prime[j]]=prime[j];
if(i%prime[j]==0) break; //如果i包含了prime[j]作为它的最小质因数,应退出,因为prime[j]再往下不再是最小质因数,i中有更小的
}
}
埃氏筛分解质因数
代码
for(ll i=2;i<=n;i++){
if(min_fac[i]==0){
min_fac[i]=i;
prime.push_back(i);
}
for(ll j=i*i;j<=n;j+=i){
not_prime[j]=true;
if(min_fac[j]==0){
min_fac[j]=i;
}
}
}

浙公网安备 33010602011771号