給定n個正整數,將它們分組,使得每組中任意兩個數互質。至少要分成多少個組?
第二行是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);
}