openjudge7834_分成互质组
时空限制 1000ms/64MB
描述
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
输入
第一行是一个正整数n。1 <= n <= 10。
第二行是n个不大于10000的正整数。
输出
一个正整数,即最少需要的组数。
样例输入
6 14 20 33 117 143 175
样例输出
3
代码
#include<iostream>
using namespace std;
const int N = 15;
int n,a[N],f[N],ans; //f[i]存a[i]分的组
int gcd(int a,int b){
return a%b==0 ? b : gcd(b,a%b);
}
void dfs(int i){ //a[i]分到哪一个组
if (i>n) return;
bool visited[N]={0};
for (int j=i-1; j>=1; j--) //遍历前i-1个数
if (!visited[j]){ //查找a[j]所在分组
bool OK=true; //是否互质标记
for (int k=j; k>=1; k--) //遍历a[j]所在分组的所有元素
if (f[k]==f[j]){ //若a[k]和a[j]同一个分组
visited[k] = true;
if (gcd(a[k],a[i])!=1) OK=false; //a[k]与a[i]不互质
}
if (OK) { f[i]=f[j]; break; } //都互质,加入该组
}
if (f[i]==0) f[i]=++ans; //所有组都不互质,加入新组
dfs(i+1);
}
int main(){
cin>>n;
for (int i=1; i<=n; i++) cin>>a[i];
ans = f[1] = 1; //a[1]分到1组
dfs(2);
cout<<ans<<endl;
return 0;
}