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. SQL server 批量删除表

    select 'drop table '+name+';' from sys.tables declare c cursor forselect NAME from sysobjects where ...

  2. 普冉PY32系列(十五) PY32F0系列的低功耗模式

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...

  3. vim 使用black 格式化python代码

    vim 使用black 格式化代码 github black 的github https://github.com/psf/black 安装 pip3 install black 使用 black f ...

  4. ollama 源代码中值得阅读的部分

    阅读 Ollama 源代码以了解其内部工作机制.扩展功能或参与贡献,以下是一些值得重点关注的部分: 1. 核心服务模块: 查找负责启动和管理模型服务的主程序或类,这通常是整个项目的核心逻辑所在.关注如 ...

  5. CSS旋转正方体

    CSS实现一个旋转的正方体,鼠标放上去会自动解体.比较普通的实现,留个记录.(代码里的注释方式写错了) <!doctype html> <html lang="en&quo ...

  6. windows下使用winget快速安装nvm

    前置条件: 操作系统 >= win10 安装 首先使用winget搜索nvm包 winget search nvm #搜索结果如下图 安装nvm winget install CoreyButl ...

  7. linux文件权限管理:文件权限类型,文件权限影响,设定文件权限,取消文件权限

    目录 一.关于文件权限 二.查看文件权限 三.linux下常见文件类型 四.linux下常见的文件权限 五.权限对文件和目录的影响 六.文件的用户分类 七.更改文件的属主和属组 八.一个文件取消所有权 ...

  8. 基于FPGA的计算器设计---第一版

    欢迎各位朋友关注"郝旭帅电子设计团队",本篇为各位朋友介绍基于FPGA的计算器设计---第一版. 功能说明: 1. 计算器的显示屏幕为数码管. 2. 4x4矩阵键盘作为计算器的输入 ...

  9. iOS MonkeyDev 尝试体验(非越狱开发)

    一.前言 随着iOS系统的逐渐开放,iOS越狱需求的人越来越少,那么在非越狱系统上面开发越狱插件那将是一个不错的选择,在github上面发现一个开源的Xcode工程模板. 整合了越狱开发的工具.重签名 ...

  10. [机器学习] 低代码机器学习工具PyCaret库使用指北

    PyCaret是一个开源.低代码Python机器学习库,能够自动化机器学习工作流程.它是一个端到端的机器学习和模型管理工具,极大地加快了实验周期,提高了工作效率.PyCaret本质上是围绕几个机器学习 ...