集合

题目链接:https://www.luogu.com.cn/problem/P1621

题意:

对于区间[a,b]的所有数,如果拥有相同质因子且其大于等于p,那么为同一集合,求最后有多少个集合

思路:

并查集,先通过筛法求出大于等于p的质因数,再从1枚举到其乘积大于b时,将这些数全部merge到同一个集合

最后检查区间内多少个数父亲还是自己,表示集合的总数

int f[maxn];
vector<int>prime;
int vis[maxn];

void eluer(int n){
	for(int i=2;i<=n;i++){
		if(!vis[i])prime.pb(i);
		for(int j=0;j<prime.size()&&i*prime[j]<=n;j++){
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}

int find(int x){
if(f[x]!=x){
	f[x]=find(f[x]);
}
return f[x];
}

void merge(int x,int y){
	if(find(x)!=find(y)){
		if(find(x)>find(y)){
			f[find(y)]=find(x);
		}else{
			f[find(x)]=find(y);
		}
	}
}

void solve(){
	int a,b,p;cin>>a>>b>>p;
	for(int i=1;i<=b;i++){
		f[i]=i;
	}
	eluer(b);
	
	for(int i=0;i<prime.size();i++){
		int num=prime[i];if(num<p)continue;
		for(int j=1;;j++){
			if(num*j>b)break;
			merge(num*j,num);
		}
	}
	
	int cnt=0;
	for(int i=a;i<=b;i++){
		if(f[i]==i)cnt++;
	}
	cout<<cnt<<endl;
}
posted @ 2025-03-29 18:24  Marinaco  阅读(30)  评论(0)    收藏  举报
//雪花飘落效果