蒜头君给定 nn 个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
输入格式
第一行是一个正整数 nn。1 \le n \le 101≤n≤10。
第二行是 nn 个不大于 1000010000 的正整数。
输出格式
一个正整数,即最少需要的组数。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
6
14 20 33 117 143 175
样例输出复制
3
本题可用较常规方法,但是需要明白一个基本原理:当一个空数组中加入一个数,然后加入第二个数,如果第二个数和第一个数互质,则组内互质,同理,加入第三个数,如果第三个数分别和前面两个数互质,则组内互质
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<vector>
using namespace std;
bool huzhi(int x,int y){
int a=max(x,y),b=min(x,y);
while(b!=0){
int r=a%b;
a=b;
b=r;
}
if(a!=1) return false;
return true;
}
int main(){
int n;
cin >> n;
int a[100];
for(int i=0;i<n;i++){
cin >> a[i];
}
vector<int> ans[100];
for(int i=0;i<n;i++){
if(i==0){
ans[0].push_back(a[i]);
}
else{
bool check=false;
int j=0;
for(j=0;ans[j].size()>0;j++){
bool flag=true;
for(int k=0;k<ans[j].size();k++){
if(!huzhi(a[i],ans[j][k])){
flag=false;
break;
}
}
if(flag==false){
continue;
}else{
ans[j].push_back(a[i]);
check=true;
break;
}
}
if(check==false){
ans[j].push_back(a[i]);
}
}
}
int cnt=0;
for(cnt=0;ans[cnt].size()>0;cnt++){
continue;
}
cout<<cnt<<endl;
return 0;
}