/*********************************************************************
    $PROGRAM$: 
    $DATETIME$: 2026/3/21 13:34:21
    $DESCRIPTION$: 
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;

int n;
int a[14],b[14];
int ans=INT_MAX;
int nowzu=0;

int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}

bool huzhi(int x,int y){
	return gcd(x,y)==1;
}

void dfs(int k){
	if(k>n){
		if(nowzu<ans)
			ans=nowzu;
		return;
	}
	bool flag;
	for(int i=1;i<=nowzu;i++){
		flag=1;
		for(int j=1;j<k;j++){
			if(b[j]!=i)continue;
			if(!huzhi(a[k],a[j])){
				flag=0;
				break;
			}
		}
		if(flag){
			b[k]=i;
			dfs(k+1);
		}
	}
	nowzu++;
	b[k]=nowzu;
	dfs(k+1);
	nowzu--;
}

int main() {
    //
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    dfs(1);
    cout<<ans;
	return 0;
}

2 条评论

  • @ 2026-7-17 17:43:24

    ???

    • @ 2026-3-21 16:50:24

      有注释版:

      /*********************************************************************
          $PROGRAM$: 
          $DATETIME$: 2026/3/21 13:34:21
          $DESCRIPTION$: 
      *********************************************************************/
      #include <bits/stdc++.h>
      using namespace std;
      
      int n;
      int a[14],b[14];
      int ans=INT_MAX;//答案初始化为假想无穷大 (int类型上限) 
      int nowzu=0;
      
      int gcd(int x,int y){//辗转相除求最大公约数 
      	return y?gcd(y,x%y):x;
      }
      
      bool huzhi(int x,int y){
      	return gcd(x,y)==1;//最大公约数为 1 则互质,否则不互质 
      }
      
      void dfs(int k){//放第k个数 
      	if(k>n){//更新答案 
      		if(nowzu<ans)
      			ans=nowzu;
      		return;
      	}
      	bool flag; 
      	for(int i=1;i<=nowzu;i++){//尝试将a[k]放入第i个组 
      		flag=1;
      		for(int j=1;j<k;j++){
      			if(b[j]!=i)continue;//a[j]是否在第i个组中 
      			if(!huzhi(a[k],a[j])){
      				flag=0;//a[k]与第i个组中至少一个数不互质 ,无法放置 
      				break;
      			}
      		}
      		if(flag){
      			b[k]=i;//尝试将a[k]放入第i个组
      			dfs(k+1);//放第k+1个数 
      		}
      	}
      	nowzu++;
      	b[k]=nowzu;//尝试将a[k]放入新的组 
      	dfs(k+1);//放第k+1个数 
      	nowzu--;//恢复状态 
      }
      
      int main() {
          //输入 
          cin>>n;
          for(int i=1;i<=n;i++)
          cin>>a[i];
          dfs(1);//搜索 
          cout<<ans;
      	return 0;
      }
      
      
      • 1