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 ≤ 10
5), denoting the number of people. The next line contains n distinct integers a
1, a
2, . . . , a
n(1 ≤ a
i ≤ 10
5) separated by a single space, where a
i 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

这几周花了好多时间在看代码,虽然明知道是容斥原理,但是搜遍百度得到的答案也就是容斥原理四个字,呵呵,算我学艺不精,先把题解留在这里等以后再完善吧。

题目大意:给一个数组,求出这些数字两两互质或者两两不互质的情况的个数。
题目思路:毫无疑问暴力绝对超时。于是我们把问题转换成求两两搭配的个数减去正好一个数a与另一个数b互质,a同时和另一个数c不互质的情况的个数。但这样求
一个数a与另一个数b互质,a同时和另一个数c不互质的情况的个数这个问题还稍显复杂,我们想想两个数之间不就只有互质和不互质的关系吗(也就是最大公约数为1和最大公约数不为1)?好了,接下来是网上搜到的比较易懂的代码(有些大神的代码真是看得眼晕,凡是主函数低于5行的都转得我眼晕)。
代码因为是很久搜到的,现在已经无法查明出处了,在这里要向原作者道歉,也希望有人提示一下原博客的网址(话说有人看么)。
#include <cstdio>
#include <cstring>
#include<iostream>
#include <cmath>
#include <vector>
using namespace std;
const int maxn = 100005;
int a[maxn], cnt[maxn];
vector <int> tmp;
int main() {
int T, n, x;
scanf("%d", &T);
while(T--) {
long long ans = 0;
scanf("%d", &n);
memset(a, 0, sizeof(a));
memset(cnt, 0, sizeof(cnt));
//a[x]表示x的个数有多少个
for(int i = 0; i < n; i++) {
scanf("%d", &x);
a[x]++;
}
//cnt[i]表示数组中约数为i的个数
for(int i = 1; i < maxn; i++) {
for(int j = i; j < maxn; j += i) {
cnt[i] += a[j];
}
}
//tmp用来储存一个数字的所有质因数(好专业的样子)
for(int i = 1; i < maxn; i++) {
if(a[i]) {
tmp.clear();
int t = i;
int u = (int)sqrt(i);
for(int j = 2; j <= u; j++) {
if(t % j == 0) {
tmp.push_back(j);
while(t % j == 0) t /= j;
}
}
if(t > 1) tmp.push_back(t);
if(tmp.size() == 0) continue;
//接下来这个循环我就看不懂了
int nop = 0;
int v = tmp.size();
int nn = 1 << v;
for(int j = 1; j < nn; j++) {
int flag = 0;
int mul = 1;
for(int k = 0; k < v && j >> k; k++) {
if((j >> k) & 1) {
flag++;
mul *= tmp[k];
}
}
if(flag & 1) nop += cnt[mul]; else nop -= cnt[mul];
}
//nop大概表示不互质的个数,因为一个数本身也会和自己不互质,所以要减1
//ans很明显就是一个数a与另一个数b互质,a同时和另一个数c不互质的情况的个数了
ans += (long long)max(0, nop - 1) * (n - nop);
}
}
/*有些人会奇怪ans要除以2,其实ans实际上里面包括位置的不同的情况,就正如有三个位置,
a的位置已经固定在第一个不能改变,b和c因为两个不同的位置要算两种情况,但是我们并不需要
计较位置不同的情况,所以要除以2
*/
printf("%I64d\n", (long long)n * (n - 1) * (n - 2) / 6 - ans / 2);
}
return 0;
}
/*
1
5
1 3 9 10 2
ans:4
*/


hdu 5072 coprime不完整题解的更多相关文章

  1. HDU 5072 Coprime (单色三角形+容斥原理)

    题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  2. hdu 5072 Coprime

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出 n 个互不相同的数,求满足以下条件的三元无序组的个数:要么两两互质要么两两不互质. 思路:根据 ...

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

    pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜 ...

  4. hdu 5072 Coprime 容斥原理

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

  5. hdu 5072 Coprime (容斥)

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

  6. ACM学习历程—HDU 5072 Coprime(容斥原理)

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

  7. Hdu 5072 Coprime(容斥+同色三角形)

    原题链接 题意选出三个数,要求两两互质或是两两不互质.求有多少组这样的三个数. 分析 同色三角形n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数反面考虑这个问题,只 ...

  8. HDU 5072 Coprime 同色三角形问题

    好吧,我承认就算当时再给我五个小时我也做不出来. 首先解释同色三角形问题: 给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色.然后将这些点两两相连.于是每三个点都会组成 ...

  9. 题解报告:hdu 4135 Co-prime(容斥定理入门)

    Problem Description Given a number N, you are asked to count the number of integers between A and B ...

  10. HDU 4135 Co-prime(容斥:二进制解法)题解

    题意:给出[a,b]区间内与n互质的个数 思路:如果n比较小,我们可以用欧拉函数解决,但是n有1e9.要求区间内互质,我们可以先求前缀内互质个数,即[1,b]内与n互质,求互质,可以转化为求不互质,也 ...

随机推荐

  1. WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的 Click 事件

    本文记录 WPF 的一个已知问题,在 RepeatButton 上开启 IsManipulationEnabled 漫游支持之后,将会导致触摸长按到 RepeatButton 之上时,不会收到源源不断 ...

  2. dotnet 修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库

    本文告诉大家如何简单修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库 我的应用在 Windows 上跑的好好的,放在 Linux 上一运行就炸掉了,异常内容如下 ...

  3. python3生成随机单词或者语句

    pip install RandomWords Random words: >>> from random_words import RandomWords >>> ...

  4. ffmpeg7.0常用命令笔记 windows下

    1.多媒体格式转换 ffmpeg -i input.mov -acodec copy -vcodec copy out.mp4 2.从多媒体文件中抽取音频 ffmpeg -i input.mov -v ...

  5. Js中valueOf和toString区别和使用

    对于number.string.Boolean.object.symbol数据类型调用valueOf方法,得到的都是数据本身(null.undefined两种类型上的原型链上没有valueOf方法) ...

  6. 数据结构单向链表——找到并输出倒数第k个结点的数据

    /********************************************************************************************** * fu ...

  7. IPv6 — 综合组网技术

    目录 文章目录 目录 前文列表 IPv4v6 综合组网技术(转换机制) 双栈策略 隧道策略 前文列表 <IPv6 - 网际协议第 6 版> <IPv6 - 地址格式与寻址模式> ...

  8. docker多主机管理docker-machine

    docker-machine https://docs.docker.com/machine/ https://www.runoob.com/docker/docker-machine.html ht ...

  9. Github打不开解决办法(最新有效)

    Github打不开解决办法(最新有效) 1.  先看没解决之前的截图: 2.  解决方法(手动修改DNS): 2.1  以win11为例,第一步:打开 设置 - 网络和Internet,找到 高级网络 ...

  10. H.264码流解析

    这一篇内容旨在对H.264码流中的一些概念做简单了解. 1.概念了解 VCL:Video Coding Layer视频编码层,它是H.264(AVC)编码中的核心,负责视频数据的编码工作.VCL层会应 ...