hdu 5072 coprime不完整题解
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.
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.
1
5
1 3 9 10 2
4
一个数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不完整题解的更多相关文章
- HDU 5072 Coprime (单色三角形+容斥原理)
题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- hdu 5072 Coprime
http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出 n 个互不相同的数,求满足以下条件的三元无序组的个数:要么两两互质要么两两不互质. 思路:根据 ...
- hdu 5072 Coprime(同色三角形+容斥)
pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜 ...
- hdu 5072 Coprime 容斥原理
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- hdu 5072 Coprime (容斥)
Problem Description There are n people standing in a line. Each of them has a unique id number. Now ...
- ACM学习历程—HDU 5072 Coprime(容斥原理)
Description There are n people standing in a line. Each of them has a unique id number. Now the Ragn ...
- Hdu 5072 Coprime(容斥+同色三角形)
原题链接 题意选出三个数,要求两两互质或是两两不互质.求有多少组这样的三个数. 分析 同色三角形n个点 每两个点连一条边(可以为红色或者黑色),求形成的三条边颜色相同的三角形的个数反面考虑这个问题,只 ...
- HDU 5072 Coprime 同色三角形问题
好吧,我承认就算当时再给我五个小时我也做不出来. 首先解释同色三角形问题: 给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色.然后将这些点两两相连.于是每三个点都会组成 ...
- 题解报告:hdu 4135 Co-prime(容斥定理入门)
Problem Description Given a number N, you are asked to count the number of integers between A and B ...
- HDU 4135 Co-prime(容斥:二进制解法)题解
题意:给出[a,b]区间内与n互质的个数 思路:如果n比较小,我们可以用欧拉函数解决,但是n有1e9.要求区间内互质,我们可以先求前缀内互质个数,即[1,b]内与n互质,求互质,可以转化为求不互质,也 ...
随机推荐
- 2019-8-31-PowerShell-使用-WMI-获取信息
title author date CreateTime categories PowerShell 使用 WMI 获取信息 lindexi 2019-08-31 16:55:58 +0800 201 ...
- Jenkins 简述及其搭建
什么是持续集成? 持续集成(CI)是在软件开发过程中自动化和集成许多团队成员的代码更改和更新的过程.在 CI 中,自动化工具在集成之前确认软件代码是有效且无错误的,这有助于检测错误并加快新版本的发布. ...
- 全网最详细SpringCloud-实用篇
SpringCloud-实用篇 学习安排 技术分类 1.微服务 ①架构对比 架构 单体架构 分布式架构 描述 将业务的所有功能集中在一个项目中开发,打成一个包部署. 根据业务功能对系统做拆分,每个业务 ...
- Tomcat+web测试环境配置
一.JDK安装完成 二.Tomcat安装配置 1:官网下载tomact,地址为:https://tomcat.apache.org/download-80.cgi 2:将下载后的文件解压 3:进入To ...
- To Be Vegetable
求满足下述条件的 \(n\) 阶排列 \(a\) 的数目:对每个 \(i\),要么 \(a_i-i\le a_j-j+d\) 对所有 \(j\gt i\) 成立,要么 \(a_i\ge a_j\) 对 ...
- Win10-常用cmd命令与快捷键
以下全部是本人私认为平时经常用到的指令,持续更行中- 常用快捷键 win + R : 输入cmd回车,打开命令提示符界面 win + E : 打开文件资源管理器(俗称:文件夹) win + S : 搜 ...
- 初识上位机(上):搭建PLC模拟仿真环境
大家好,我是Edison. 作为一个工业自动化领域的程序员,不懂点PLC和上位机,貌似有点说不过去.这里我用两篇小文带你快速进入上位机开发领域.后续,我会考虑再出一个系列文章一起玩工控上位机. 什么是 ...
- 【阿里天池云-龙珠计划】薄书的机器学习笔记——快来一起挖掘幸福感!Task04
[给各位看官请安] 大家一起来集齐七龙珠召唤神龙吧!!! 学习地址:AI训练营机器学习-阿里云天池 推荐一下我由此上车的公众号:AI蜗牛车,时空序列相关文章挺多的. Task01:基于逻辑回归模型的多 ...
- redis cluaster (redis分布式集群 redis分片集群)
redis cluaster (redis分布式集群) 高可用: 在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动 ...
- .NET程序对接 OpenTelemetry logs
OpenTelemetry 简介 OpenTelemetry 是一个由 CNCF(Cloud Native Computing Foundation)托管的开源项目,旨在为观察性(Observabil ...