HDU 3908 Triple


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


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值