找不到思路哪里错了,求解
  • 板块P1621 集合
  • 楼主Luochen567
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/15 21:20
  • 上次更新2023/11/15 22:49:36
查看原帖
找不到思路哪里错了,求解
1087205
Luochen567楼主2023/11/15 21:20

我的思路是先把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;
}
2023/11/15 21:20
加载中...