http://acm.hdu.edu.cn/showproblem.php?pid=3908
这个应该是一道很简单的数学题了,前提是在高中的时候,来大学后,一些东西都忘的差不多了,BS下自己。
题意是:
1.在三元集合中:满足两两互质的情况。
2 不满足互质的情况。
开始想的时候是直接暴力,然后看了下数据,一定会超时。
其实这个东西在高中的时候应该很容易解决的说。
简单排列组合知识。
int co_prime[i] 表示和s[i] 互质的个数
int unco_prime[N]; 表示和s[i]不互质的个数
co_prime[i] * unco_prime[i] 表示s[i] 和一个数互质和另外一个不互质的个数,即不满足题意的个数,又因为它要求(a, b, c) and (b, a, c)是相同的,所以 / 2 需要。
然后,用所有组合减去不满足题意的个数就得到答案。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000 int co_prime[N]; //两个数互质 int unco_prime[N]; //不互质 int s[N]; int Gcd(int a, int b) { return a%b?Gcd(b,a%b):b; } int main() { int t,n,i,j,sum; scanf("%d",&t); while(t--){ scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&s[i]); for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i == j)continue; if(Gcd(s[i],s[j]) == 1)co_prime[i] ++; else unco_prime[i] ++; } } sum = 0; for(i=1;i<=n;i++)sum += co_prime[i] * unco_prime[i]; printf("%d\n",n*(n-1)*(n-2)/6- sum/2); for(i=0;i<=n;i++)co_prime[i] = unco_prime[i] = 0; } return 0; }