分成互質組

描述

給定n個正整數,將它們分組,使得每組中任意兩個數互質。至少要分成多少個組?

輸入 第一行是一個正整數n。1 <= n <= 10。
第二行是n個不大於10000的正整數。 輸出 一個正整數,即最少需要的組數。 樣例輸入
6
14 20 33 117 143 175
樣例輸出
3
來源

2008年第十三屆“華羅庚金盃”少年數學邀請賽 決賽第5題

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
	if(b==0)return a;
	return gcd(b,a%b);
}
int n;
int v[20];
int fa[20];
int find(int x)
{
	if(fa[x]!=x)fa[x]=find(fa[x]);
	return fa[x];
}
bool vis[20];
bool check(int a,int b)
{
	int f=find(a);
	for(int i=1;i<=n;i++)
	{
		if(find(i)==f&&i!=b)//一定要加i!=b,否則第二次找到這個數對時返回false,無法更新vis。手動試試。
		{
			if(gcd(v[i],v[b])!=1)return false;
		}
	}
	return true;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&v[i]);
		fa[i]=i;
	}
	vis[1]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i!=j&&!vis[j])
			{
				if(check(i,j))
				{
					fa[j]=find(i);
					vis[j]=1;
				}
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(fa[i]==i)ans++;
	}
	printf("%d\n",ans);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章