给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long ll;
int n,ans=12;
ll a[12],tmp[12];
ll gcd(ll a,ll b){return b==0 ? a:gcd(b,a%b);}
void dfs(int i,int num)
{
if (num>=ans) return ;
if (i==n+1) {ans=num;return ;}
ll g;
for (int j=1;j<=num;j++)
if ((g=gcd(tmp[j],a[i]))==1)
{
tmp[j]=tmp[j]*a[i];
dfs(i+1,num);
tmp[j]=tmp[j]/a[i];
}
tmp[num+1]=a[i];
dfs(i+1,num+1);
tmp[num+1]=1;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++) tmp[i]=1;
tmp[1]=a[1];
dfs(2,1);
printf("%d",ans);
return 0;
}
总结
1:这道题很好地说明了,搜索的方式会很大程度上影响搜索的复杂度,(清北day2 T1也是)
2:还有对于搜索判断是否满足情况,尽量想办法把O(n)判断降到log或更低。这题中要求与其他数均互质,其实就是要求与其他数的最小公倍数互质。