HDU-5072 补集转化+容斥原理
题意:给n个数,求满足一下条件的三元组(a,b,c)数量:a,b,c两两互质或者a,b,c两两不互质。
解法:这道题非常巧妙地运用补集转化和容斥原理。首先我们令这n个数为n个点,然后两两之间连边如果是互质连黑色不互质连红色,那么这个图就会变成完全图。那么题目就是要求我们计算这个完全图的同色三角形数量。观察发现同色三角形数量非常难求但是异色三角形数量好求,因为每个异色三角形对应三个点必定有两个点是连接两条异色边的。并且这种关系是一一对应的,那么我们就可以对于每个点求出连接该点的异色边对数,就可以求出与该点相关的异色三角形数量(注意这里用的词是相关,那么一个异色三角形与两个异色点相关所以答案要除以2)。
那么问题就变成怎么快速找到一个点连接的异色边对数呢?很容易想到如果点i的异色边数为e[i]的话,同色边数就是n-e[i]-1,那么对数就是(e[i])*(n-e[i]-1)。但是问题是怎么快速计算e[i]的数量?也就是说对于a[i]怎么快速求出n个数中有几个数与a[i]互质?
这个问题是此题关键。我们用到容斥原理:与一个数a[i]不互质的数数量=至少拥有a[i]的一个质因子数量-至少拥有a[i]的两个质因子数量+至少拥有a[i]的三个质因子数量-至少拥有a[i]的四个质因子数量......。那么我们就先求出mul[i]代表n个数中拥有i因子的数的数量(这里具体是用到状态压缩枚举的办法,具体看代码很好懂),得到mul之后对于a[i]与它不互质的数的个数就是a[i]的质因子组合用利用mul数组计算上诉的容斥原理式子得到。
到这里此题可解了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,m,a[N],mul[N],e[N];
vector<int> fac[N]; void prework() { //预处理1-100000的因子
for (int i=;i<=;i++) {
int n=i;
for (int j=;j*j<=n;j++) {
if (n%j==) {
fac[i].push_back(j);
while (n%j==) n/=j;
}
}
if (n>) fac[i].push_back(n);
}
} int main()
{
prework();
int T; cin>>T;
while (T--) {
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
memset(mul,,sizeof(mul));
memset(e,,sizeof(e));
for (int i=;i<=n;i++) {
int ALL=<<fac[a[i]].size();
for (int j=;j<ALL;j++) {
int sum=;
for (int k=;k<fac[a[i]].size();k++)
if (j&(<<k)) sum=sum*fac[a[i]][k];
mul[sum]++; //代表是sum倍数的a[i]的个数++
}
}
for (int i=;i<=n;i++) {
int ALL=<<fac[a[i]].size();
for (int j=;j<ALL;j++) {
int sum=,sig=-;
for (int k=;k<fac[a[i]].size();k++)
if (j&(<<k)) sum=sum*fac[a[i]][k],sig*=-;
e[i]+=sig*mul[sum]; //容斥原理求与a[i]不互质的数个数(包括自己)
}
e[i]=n-e[i]; //补集就是与a[i]互质的数个数(不包括自己)
if (a[i]==) e[i]=n-;
} long long ans=,tmp=;
for (int i=n;i>n-;i--) ans=ans*i;
ans=ans/; //计算全集C(n,3) for (int i=;i<=n;i++) tmp+=(long long)(e[i])*(n-e[i]-); //计算异色三角形数量
printf("%lld\n",ans-tmp/);
}
return ;
}
HDU-5072 补集转化+容斥原理的更多相关文章
- ACM学习历程—HDU 5072 Coprime(容斥原理)
Description There are n people standing in a line. Each of them has a unique id number. Now the Ragn ...
- 容斥原理+补集转化+MinMax容斥
容斥原理的思想大家都应该挺熟悉的,然后补集转化其实就是容斥原理的一种应用. 一篇讲容斥的博文https://www.cnblogs.com/gzy-cjoier/p/9686787.html 当我们遇 ...
- 概述「并查集补集转化」模型&&luoguP1330 封锁阳光大学
奇妙的模型转化以及并查集思想 模型概述 有图$G=(V,E)$,初始所有点为白色,现在要将其中一些点染为黑色,要求染色后满足:$∀(u,v)∈E$,$∃col_u!=col_v$.求最小染色点数. 题 ...
- HDU 5072 Coprime (单色三角形+容斥原理)
题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- hdu 5072 计数+容斥原理
/* 题意: 给出n个数(n<100000), 每个数都不大于100000,数字不会有重复.现在随意抽出3个,问三个彼此互质 或者 三个彼此不互质的数目有多少. 思路: 这道题反着想,就是三个数 ...
- hdu 5072 Coprime 容斥原理
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- hdu 5072 Coprime(同色三角形+容斥)
pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜 ...
- HDU 2204Eddy's爱好(容斥原理)
Eddy's爱好 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- hdu 5072 Coprime
http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出 n 个互不相同的数,求满足以下条件的三元无序组的个数:要么两两互质要么两两不互质. 思路:根据 ...
随机推荐
- Kotlin学习笔记(9)- 数据类
系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...
- 分布式理论 BASE、CAP、ACID
CAP原理: 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(Co ...
- Es学习第十一课,使用java操作elasticsearch
前面十节课我们已经把ES的基本概念和使用讲的差不多了,现在我们就用基于java来实际开发一个操作ES的小项目,带大家来一起练练手. 1.我们用IDEA创建一个maven项目 项目结构如上图所示,然后我 ...
- 使用字符流(Writer、Reader)完成对文件的读写操作
字符流 字符输出流:Writer,对文件的操作使用子类FileWriter 字符输入流:Reader,对文件的操作使用子类FileReader 每次操作的是一个字符 文件字符操作流会自带缓存,默认大小 ...
- spring Boot 简单的登录功能,利用了jdbcTemplate.class完成sql语句的执行,无需service层、dao层和.xml文件
1.搭建SpringBoot项目首先我们先在IDEA上创建一个SpringBoot的Web项目(1)file ——> new ——> project——> Spring Initia ...
- HTTP Error 500.30 - ANCM In-Process Start Failure
环境 windown 10 IIS 10 net core 2.2 vs2019 背景 在vs2019使用net core 2.2发布到IIS 10上(见在 ASP.NET Core 中使用多个环境) ...
- js-放大镜效果
jd或者淘宝的具体商品有个放大镜的效果.虽然网上类似插件琳琅满目,应用到项目上有诸多不便,自己抽点时间自己写了个类似插件,积累下代码,何乐而不为呢!!let‘go: 打算把此特效封装成个插件,先把最基 ...
- 用JSP实现WEB页面登录验证
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- Android USB驱动源码分析(-)
Android USB驱动中,上层应用协议里最重要的一个文件是android/kernel/drivers/usb/gadget/android.c.这个文件实现USB的上层应用协议. 首先包含了一些 ...
- 英语单词substitution
substitution 来源——shell字符串切片 [root@centos73 ~]# echo ${$alpha:3:4} -bash: ${$alpha:3:4}: bad substitu ...