您的位置:首页 > 运维架构

OpenJudge_P7834 分成互质组

2015-11-29 11:40 330 查看
总时间限制: 1000ms 内存限制: 65536kB

描述

给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?

输入

第一行是一个正整数n。1 <= n <= 10。

第二行是n个不大于10000的正整数。

输出

一个正整数,即最少需要的组数。

样例输入

6

14 20 33 117 143 175

样例输出

3

来源

2008年第十三届“华罗庚金杯”少年数学邀请赛 决赛第5题

辗转相除法

#include<cstdio>
#include<iostream>
using namespace std;
#define N 15
int a
,n,s

,ans;bool b
;
int gcd(int a,int b){return a%b==0?b:gcd(b,a%b);}
bool prime(int x,int p){
for(int i=1;i<=s[p][0];i++){
if(a[x]>=s[p][i])
if(gcd(a[x],s[p][i])!=1)
return false;
if(a[x]<s[p][i])
if(gcd(s[p][i],a[x])!=1)
return false;
}
return true;
}
void work(int i,int k){
if(i==n+1){ans=min(ans,k);return;}
for(int j=1;j<=k;j++){
if(prime(i,j)){
s[j][++s[j][0]]=a[i];
work(i+1,k);
s[j][s[j][0]--]=0;
}
}
s[k+1][0]=1;s[k+1][1]=a[i];
work(i+1,k+1);
s[k+1][0]=0;s[k+1][1]=0;
}
int main(){
scanf("%d",&n);ans=10;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
s[1][0]=1,s[1][1]=a[1];
work(2,1);
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  互质 OpenJudge