/*********************************************************************
    $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;
}

1 条评论

  • @ 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