集合
题目链接: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;
}

浙公网安备 33010602011771号