分成互质组
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1221
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
【输入】
第一行是一个正整数n。1 <= n <= 10。
第二行是n个不大于10000的正整数。
【输出】
一个正整数,即最少需要的组数。
【输入样例】
6 14 20 33 117 143 175
【输出样例】
3
题解:一组中的数两两互质,则任意一个数与其中两数的积互质
#include<iostream> #include<cstdio> #include<cstring> using namespace std; long long f[11]; int n,minn=10,a[11]; long long gcd(long long a,long long b) { if(!b)return a; return gcd(b,a%b); } void s(int i,int k){ if(i==n+1) { if(k<minn)minn=k; return ; } for(int j=1;j<=k;j++) { if(gcd(f[j],a[i])==1) { f[j]*=a[i]; s(i+1,k); f[j]/=a[i]; } } f[k+1]=a[i]; s(i+1,k+1); f[k+1]=0; } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<11;i++)f[i]=1; s(1,1); cout<<minn<<endl; }