我的思路是先把fa中质数变0,然后遍历把有公共质因数的用并查集合起来,然后遍历数组,对于fa中不为0且最大父亲也不为0的,ans+1,然后最大父亲变为0,最后得结果,不知道哪里错了,求解
#include<iostream>
#include<algorithm>
#include<string>
#include<unordered_map>
using namespace std;
int a, b, p,fa[100005],ans;
bool isprime[100005];
void make_prime(int x)
{
for (int i = 2; i <= x; i++)
{
int flag = 1;
for (int j = 2; j * j <= i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
isprime[i] = 1;
}
}
}
int find(int x)
{
if (fa[x] == x)
{
return x;
}
else
{
return fa[x] = find(fa[x]);
}
}
bool mz(int x, int y)
{
int m = min(x, y);
for (int i = m; i >= p; i--)
{
if (x % i == 0 && y % i == 0 && isprime[i])
{
return true;
}
}
return false;
}
int main()
{
cin >> a >> b >> p;
make_prime(max(a, b));
for (int i = a; i <= b; i++)
{
if (isprime[i])
{
ans++;
fa[i] = 0;
}
else
{
fa[i] = i;
}
}
for (int i = a; i <= b; i++)
{
if (fa[i] == 0)
{
continue;
}
for (int j = i + 1; j <= b; j++)
{
if (fa[j] == 0)
{
continue;
}
if (find(i)!=find(j)&&mz(i,j))
{
fa[find(j)] = find(i);
}
}
}
for (int i = a; i <= b; i++)
{
if (fa[i] != 0 && find(i) != 0)
{
fa[find(i)] = 0;
ans++;
}
}
cout << ans;
return 0;
}