/*
分析:
参考别人的思路才做出来的。
摘:
解题报告:
只要统计a[i]:和第i个数互质的有多少个。
和b[i]:和第i个数不互质的有多少个。
那么a[i] * b[i]是包含i的不合法的组合的一个子集。
不难发现,对每个i进行这样的操作,能够覆盖到所有的不满足条件的abc,而且是算了两次。
所以,最后就是C(n,3)- sum/2即可。
2012-04-18
*/
}
分析:
参考别人的思路才做出来的。
摘:
解题报告:
只要统计a[i]:和第i个数互质的有多少个。
和b[i]:和第i个数不互质的有多少个。
那么a[i] * b[i]是包含i的不合法的组合的一个子集。
不难发现,对每个i进行这样的操作,能够覆盖到所有的不满足条件的abc,而且是算了两次。
所以,最后就是C(n,3)- sum/2即可。
2012-04-18
*/
#include"stdio.h"
#include"string.h"
int cor_prime(int a,int b)
{
int t;
if(a<b)
{
t=a;
a=b;
b=t;
}
t=a%b;
while(t)
{
a=b;
b=t;
t=a%b;
}
if(b==1)
return 1;
else
return 0;
}
int main()
{
int i,l;
int T;
int n;
int num[801];
int count;
int sum;
int total;
int flag1[801];
int flag2[801];
scanf("%d",&T);
while(T--)
{
memset(flag1,0,sizeof(flag1));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&num[i]);
for(i=0;i<n-1;i++)
for(l=i+1;l<n;l++)
{
if(cor_prime(num[i],num[l]))
{
flag1[i]++;
flag1[l]++;
}
}
for(i=0;i<n;i++)
flag2[i]=n-1-flag1[i];
sum=0;
for(i=0;i<n;i++)
sum+=flag1[i]*flag2[i];
sum/=2;
total=n*(n-1)*(n-2)/6;
count=total-sum;
printf("%d\n",count);
}
return 0;
}