当前位置: 代码迷 >> 综合 >> 一本通————1221 分成互质组
  详细解决方案

一本通————1221 分成互质组

热度:39   发布时间:2023-12-28 05:16:35.0

1221:分成互质组


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 4533     通过数: 2089

【题目描述】

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

【输入】

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

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

【输出】

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

【输入样例】

6
14 20 33 117 143 175

【输出样例】

3

【来源】


No

 

代码如下:

#include <bits/stdc++.h>
#define MAXN 10500
using namespace std;
int a[MAXN];
int cnt[MAXN];
int t;
bool ok(int x)    //这里用了一个数组cnt来记录同一个组内的数可以被哪些数整除 
{for(int i=2; i<x; i++){if(x%i==0){if(cnt[i])    //说明组内已有其它数可以被i整除,即x与组内的数不是互质{return false;}else{cnt[i]++;}}}return true;
}void dfs(int k,int x)
{for(int i=k; i<t; i++)        //多整个数进行查找{if(ok(a[i]))    //如果与组内的数互质{a[i]=-1;        //说明这个数已经在别的组里了k++;dfs(k,a[k]);   //注意不要进行回溯}//    cout<<"a[i]="<<a[i]<<endl;}return ;
}int main()
{int i,ans=0;cin>>t;for(i=0; i<t; i++){cin>>a[i];}for(i=0; i<t; i++){if(a[i]!=-1){ans++; //每调用一次dfs,就多一个分组memset(cnt,0,sizeof(cnt)); //记得要清零dfs(i,a[i]);}}cout<<ans<<endl;return 0;
}
/*
6
14 20 33 117 143 175
*/