这是一道图论题。。。
题目可转化为给处的n个数为n个点,任意不同2点互质就蓝边,不互质就连红边,其目的是找出3边颜色相同的三角形的个数,可以用总数减去含2种颜色的三角形的个数,其中是含1蓝2红和1红2蓝的两种情况,只要分别对每个点搜索下记录红或蓝边的个数即可;
#include <cstdio>
#include <cstring>
const int maxn=805;
int prec[maxn][5];
int map[maxn][maxn];
int tri[maxn];
void pre()
{
int i;
for (i=1 ; i<maxn ; ++i)
prec[i][1]=i;
prec[2][2]=1;
for (i=3 ; i<maxn ; ++i)
prec[i][2]=prec[i-1][2]+prec[i-1][1];
prec[3][3]=1;
for (i=4 ; i<maxn ; ++i)
prec[i][3]=prec[i-1][2]+prec[i-1][3];
}
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main ()
{
int cas,cnt,i,j;
scanf("%d",&cas);
pre();
while (cas--)
{
int n;
scanf("%d",&n);
for (i=0 ; i<n ; ++i)
scanf("%d",tri+i);
int ans=(prec[n][3]<<1);
memset(map , 0 , sizeof(map));
for (i=0 ; i<n ; ++i)
{
for (j=i+1 ; j<n ; j++)
if(gcd(tri[i],tri[j])==1)
map[i][j]=map[j][i]=1;
}
for (i=0 ; i<n ; ++i)
{
for (cnt=j=0 ; j<n ; ++j)
if(map[i][j])cnt++;
ans-=(cnt*(n-cnt-1));
}
printf("%d\n",ans>>1);
}
return 0;
}