HDU 5072 Coprime (莫比乌斯反演+容斥+同色三角形)

Coprime

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

Total Submission(s): 1469    Accepted Submission(s): 579

Problem Description

There are n people standing in a line. Each of them has a unique id number.

Now the Ragnarok is coming. We should choose 3 people to defend the evil. As a group, the 3 people should be able to communicate. They are able to communicate if and only if their id numbers are pairwise coprime or pairwise not coprime. In other words, if their
id numbers are a, b, c, then they can communicate if and only if [(a, b) = (b, c) = (a, c) = 1] or [(a, b) ≠ 1 and (a, c) ≠ 1 and (b, c) ≠ 1], where (x, y) denotes the greatest common divisor of x and y.

We want to know how many 3-people-groups can be chosen from the n people.

Input

The first line contains an integer T (T ≤ 5), denoting the number of the test cases.

For each test case, the first line contains an integer n(3 ≤ n ≤ 105), denoting the number of people. The next line contains n distinct integers a1, a2, . . . , an(1 ≤ ai ≤ 105) separated by
a single space, where ai stands for the id number of the i-th person.

Output

For each test case, output the answer in a line.

Sample Input

1
5
1 3 9 10 2

Sample Output

4

Source

2014 Asia AnShan Regional Contest

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5072

题目大意:给n个互不相同的数,从中选三个,求三个中两两都互质或者两两都不互质的组数

题目分析:开始想歪了,三个数两两都互质并不是说三个数的最大公约数为1,所以正着不好算,考虑算反面即三个中只有一对互质或者只有两对互质的情况,再用C(n,3)减即可,我们把三个数当做三角形的三个顶点A,B,C,枚举顶点A,不妨设A与B互质,A与C不互质,则这样就组成了一对反面情况,至于B,C可以互质也可以不互质,因此算出的结果要除2,具体的说,如果B,C互质,可以交换A,C,如果B,C不互质,可以交换A,B,这样都满足A与B互质,A与C不互质,因此设与A互质的数有k个,则A对答案的贡献为k
* (n - k - 1) / 2,计算每个数字对反面情况的贡献数得到反面总的情况数,拿总数减即可,还要注意的是A的值不能为1,因为没有与1不互质的数,接下来就是如何计算k的值,枚举k的因子,它所有因子倍数的个数乘因子对应的莫比乌斯函数值就是k,这里其实直接包含了容斥的过程,它某个因子的倍数可能也是另外一个因子的倍数,举个例子,比如假设最大值为20,A为12,则:

因子 :                       1     2     3    4    6   12

莫比乌斯函数值:      1    -1    -1    0   1    0

因子倍数的个数:     20   10    6    5    3    1

因此答案为20 - 10 - 6 + 3 = 7,即在1到20中与12互质的数有7个,1,5,7,11,13,17,19

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
int const MAX = 1e5 + 5;
int mob[MAX], p[MAX];
int a[MAX], num[MAX], has[MAX], cp[MAX];
bool prime[MAX];
int ma, n;

int Mobius()
{
    int pnum = 0;
    memset(prime, true, sizeof(prime));
    mob[1] = 1;
    for(int i = 2; i < MAX; i++)
    {
        if(prime[i])
        {
            p[pnum ++] = i;
            mob[i] = -1;
        }
        for(int j = 0; j < pnum && i * p[j] < MAX; j++)
        {
            prime[i * p[j]] = false;
            if(i % p[j] == 0)
            {
                mob[i * p[j]] = 0;
                break;
            }
            mob[i * p[j]] = -mob[i];
        }
    }
}

ll cal()
{
    ll all = (ll) n * (n - 1) * (n - 2) / 6;
    memset(cp, 0, sizeof(cp));
    memset(num, 0, sizeof(num));
    for(int i = 1; i <= ma; i++)
    {
        for(int j = i; j <= ma; j += i)
            num[i] += has[j];
        for(int j = i; j <= ma; j += i)
            cp[j] += mob[i] * num[i];
    }
    ll no = 0;
    for(int i = 0; i < n; i++)
        if(a[i] != 1)
            no += (ll) cp[a[i]] * (n - cp[a[i]] - 1);
    return all - no / 2;
}

int main()
{
    Mobius();
    int T;
    scanf("%d", &T);
    while(T--)
    {
        memset(has, 0, sizeof(has));
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
            has[a[i]] ++;
            ma = max(a[i], ma);
        }
        printf("%I64d\n", cal());
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 16:58:13

HDU 5072 Coprime (莫比乌斯反演+容斥+同色三角形)的相关文章

[HDU 5072] Coprime 莫比乌斯反演

题意 ? 给定一个长度为 $n$ 的序列 $A = \left\{ a_1, a_2, ..., a_n \right\}$ . ? 问有多少个三元组 $(i, j, k)(i \ne j, i \ne k, j \ne k)$ , 满足 $\left\{ \begin{aligned} & a_i \perp a_j \\ & a_i \perp a_k \\ & a_j \perp a_k \end{aligned} \right.$ 或 $\left\{ \begin{ali

HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法

题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd(a_1,a_2,a_3…a_n)=d$,显然每个$a_i$的倍数都满足,有$\frac{a_i}{d}$种方案 那么一个d对答案的贡献为\[\prod_{i=1}^{min(a)}{\lfloor\frac{a_i}{d}\rfloor}    \] 但是所有的d计入会有重复情况,考虑容斥,对d进行素数分

bzoj 2301 Problem b 莫比乌斯反演+容斥

题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数 思路:在hdu1695的基础上加上容斥,即:ans=solve(b/k,d/k)-solve((a-1)/k,d/k)-solve((c-1)/k,b/k)+solve((a-1)/k,(c-1)/k),详见代码: /********************************************************* file n

hdu 4135 Co-prime(素数分解 容斥)

容斥做,欧拉好像比这个麻烦??? 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 6 using namespace std; 7 typedef long long ll; 8 9 ll solve(ll a,ll n){ 10 vector<ll> v; 11 for(ll i = 2 ; i*i <= n ; i ++){

hdu 5072 Coprime(数论)

题目链接:hdu 5072 Coprime 题目大意:给定N个数,问能选出多少个3元组,要么[(a, b) = (b, c) = (a, c) = 1] or [(a, b) ≠ 1 and (a, c) ≠ 1 and (b, c) ≠ 1]. 解题思路:这题可以换个角度想,可以将三个数看做三角形的三条边,互质即边的颜色为1,否则为0,那么要求的即为 三条边颜色相同的三角形有多少个. 总的三角形的个数可求,那么如果求出三条边不完全相同的三角形个数,相减一下即可. 枚举顶点,然后确定以该点形成的

nyoj CO-PRIME 莫比乌斯反演

CO-PRIME 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 This problem is so easy! Can you solve it? You are given a sequence which contains n integers a1,a2……an, your task is to find how many pair(ai, aj)(i < j) that ai and aj is co-prime. 输入 There are multip

hdu 5072 Coprime(同色三角形+容斥)

pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜的一道题,要是知道这个模型....就能够轻松的拿银了啊. . . 题意不再赘述,就是求同色三角形的个数.总的三角形的个数是C(n,3),仅仅需减去不同色的三角形就可以.对于每一个点(数),与它互质的连红边,不互质的连蓝边,那么对于该点不同色三角形个数为蓝边数*红边数/2,由于同一个三角形被计算了两次. 那么同

hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion

http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不会 就自己写了个容斥搞一下(才能维持现在的生活) //别人的题解https://blog.csdn.net/luyehao1/article/details/81672837 #include <iostream> #include <cstdio> #include <cstr

HDU 5072 Coprime 同色三角形问题

好吧,我承认就算当时再给我五个小时我也做不出来. 首先解释同色三角形问题: 给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色.然后将这些点两两相连,于是每三个点都会组成一个三角形, 即总共有sum = C(3,n)个三角形.对于一个三角形,如果三个点颜色一样则称其为同色三角形. 那么一个很直观的思路就是容斥,sum - 非同色三角形个数ans. ans = (sigma (Xi*Yi) ) / 2;(1 <= i <= n,Xi,Yi分别表示与第 i 个点相连的