加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

HDU 3908 Triple 2011 Multi-University Training Contest 7 - Host by ECNU

(2011-08-02 20:30:10)
标签:

hdu

3908

it

分类: 杂题
题目描述:
给你n个数,问满足条件1或者条件2的a,b,c组合有多少个。
条件1:任意两个互质
条件2:任意两个不互质
解题报告:
比赛时想复杂了。。。
只要统计A[i]:和第i个数互质的有多少个。
和B[i]:和第i个数不互质的有多少个。
那么A[i] * B[i]是包含i的不合法的组合的一个子集。
不难发现,对每个i进行这样的操作,能够覆盖到所有的不满足条件的abc,而且是算了两次。
所以,最后就是C(n,3)- sum/2即可。
代码如下:
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int gcd(int a, int b)
{
    if (a < b) return gcd(b, a);
    if (b == 0) return a;
    return gcd(b, a % b);
}
int x[1000], n, t, A[1000], B[1000];
int main()
{
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        for(int i = 0; i < n; i++) scanf("%d", &x[i]), A[i] = B[i] = 0;
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++) if (j != i)
                if (gcd(x[i], x[j]) == 1) A[i]++;
                else B[i]++;
        int ans = n * (n - 1) * (n - 2) / 6, sum = 0;
        for(int i = 0; i < n; i++)
            sum += A[i] * B[i];
        ans -= sum / 2;
        printf("%d\n", ans);
    }
return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有