HDU 3908 Triple

来源:互联网 发布:淘宝有游戏交易平台 编辑:程序博客网 时间:2024/05/16 01:14


 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 1000int 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;}


 

 

原创粉丝点击