https://www.luogu.com.cn/problem/P1621
第一次做出来绿题,激动捏
思路很简单,用埃氏筛筛出来质数,然后用并查集就好了哈哈
https://www.luogu.com.cn/problem/P1621
#include<bits/stdc++.h>
using namespace std;
int fa[100086] = {0},rak[100086] = {0};
bool np[100086] = {false};
inline void init(int n)
{
for(int i = 1;i <= n;i ++){fa[i] = i;rak[i] = 1;}
}
inline void merge(int i,int j)
{
int x = rak[i], y = rak[j];
x <= y?fa[x] = y:fa[y] = x;
if( x != y && rak[x] == rak[y])
rak[y] ++;
}
int find(int x)
{
return fa[x] == x?x:(find(fa[x]));
}
int main()
{
int a,b,p;cin>>a>>b>>p;
init(b);
int ans = b - a + 1;
for(int i = 2;i <= b;i ++)
{
if(!np[i])
{
if(i >= p)
{
for (int j=i*2;j<=b;j+=i)
{
np[j]=true;
if (j-i >= a && find(j) != find(j-i))
{
fa[find(j)]=find(j-i);
--ans;
}
}
}
else
{
for (int j=i*2;j<=b;j+=i)
np[j]=true;
}
}
}
cout<<ans<<endl;
return 0;
}