分解质因数

前言

起因是这道题: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;
		}
	}
}
posted @ 2025-03-15 15:01  Gusare  阅读(23)  评论(0)    收藏  举报