這是一道圖論題。。。
題目可轉化為給處的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;}