ACM学习历程—HDU 5072 Coprime(容斥原理)
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 a1,
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
题目大意是在n个数里面取出三个数a, b, c,如果三者两两互质或者两两都不互质就加入计算。求总的取法数。
首先这两种情况都比较难算,于是考虑补集,其中有且仅有两个互质或者不互质。
这两种情况发现有个共同特征,就是有一个互质且有一个不互质,另外一种关系就随便了。
这样的话就是对于每一个a,计算和它互质的乘上和它不互质的。
但是这样还是有问题的:
因为对于如果(a, b) = 1 && (a, c) != 1,那么如果(b, c) = 1,发现对于数c,同样满足a的条件。
所以对于每一个数都会被计算两次,也就是每一个三元组都被计入了两次,最后结果需要除以2。
接下来就是解决如何计算对于一个a,和a互质以及不互质的数个数。
首先如果可以枚举a的质因子的话,比如p,那么所有p的倍数都是与a不互质的。
但是如果对于q,也加上q的倍数的话,会出现重复,就是pq的倍数被计算了两次。
所以这里计算的时候需要进行容斥。
考虑到这里的话,就不需要枚举a的因子了,只需要枚举所有数找倍数,用容斥判断这里的倍数个数是加还是减, 还是没有贡献。这里的容斥我用莫比乌斯系数完成的。
最后用C(n,
3)-ans/2即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <vector>
#define LL long long using namespace std; const int maxN = ;
int n, d[maxN], top;
LL f[maxN];
int prime[maxN], u[maxN], cnt;
bool vis[maxN]; void mobius()
{
memset(vis, false,sizeof(vis));
u[] = ;
cnt = ;
for(int i = ; i < maxN; i++)
{
if(!vis[i])
{
prime[cnt++] = i;
u[i] = -;
}
for(int j = ; j < cnt && (LL)i*prime[j] < maxN; j++)
{
vis[i*prime[j]] = true;
if(i%prime[j])
u[i*prime[j]] = -u[i];
else
{
u[i*prime[j]] = ;
break;
}
}
}
} void input()
{
memset(d, , sizeof(d));
scanf("%d", &n);
int tmp;
top = ;
for (int i = ; i < n; ++i)
{
scanf("%d", &tmp);
d[tmp]++;
top = max(top, tmp);
}
} void work()
{
LL ans = ;
int num;
memset(f, , sizeof(f));
for (int i = ; i <= top; ++i)
{
num = ;
for (int j = i; j <= top; j += i)
num += d[j];
for (int j = i; j <= top; j += i)
f[j] += u[i]*(-num);
}
for (int i = ; i <= top; ++i)
ans += d[i]*f[i]*(n-f[i]-);
ans = (LL)n*(n-)*(n-)/-ans/;
printf("%I64d\n", ans);
} int main()
{
//freopen("test.in", "r", stdin);
mobius();
int T;
scanf("%d", &T);
for (int times = ; times <= T; ++times)
{
input();
work();
}
return ;
}
ACM学习历程—HDU 5072 Coprime(容斥原理)的更多相关文章
- ACM学习历程—HDU 5512 Pagodas(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5512 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是给了初始的集合{a, b},然后取集合里 ...
- ACM学习历程—HDU 3915 Game(Nim博弈 && xor高斯消元)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所 ...
- ACM学习历程—HDU 5536 Chip Factory(xor && 字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题目大意是给了一个序列,求(si+sj)^sk的最大值. 首先n有1000,暴力理论上是不行的. ...
- ACM学习历程—HDU 5534 Partial Tree(动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534 题目大意是给了n个结点,让后让构成一个树,假设每个节点的度为r1, r2, ...rn,求f(x ...
- ACM学习历程—HDU 3949 XOR(xor高斯消元)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题目大意是给n个数,然后随便取几个数求xor和,求第k小的.(重复不计算) 首先想把所有xor的 ...
- hdu 5072 Coprime 容斥原理
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- ACM学习历程—HDU1695 GCD(容斥原理 || 莫比乌斯)
Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = ...
- ACM学习历程—HDU 5317 RGCDQ (数论)
Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more an ...
- ACM学习历程—HDU 2112 HDU Today(map && spfa && 优先队列)
Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线 ...
随机推荐
- nginx搭建服务
1.当然首先是安装nginx :http://nginx.org/en/download.html 2.一波安装之后 3.在nginx 文件夹打开命令行:cmd 4.开启nginx 服务命令:star ...
- jmeter--基于http+json接口的功能测试
jmeter--基于http+json接口的功能测试 测试项目叫做smile_task,简称sm_task.这是一个基于nodejs超简单的todo list,sm_task没有任何UI界面(纯接口) ...
- [DBNETLIB][ConnectionOpen(Connect()).]SQL Server 不存在或拒绝访问 数据库错误 解决办法总结
连接数据库报错:“数据库异常:[DBNETLIB] [ConnectionOpen(Connenct()).] Sqlserver 不存在或拒绝访问” 原因: 1.查看是不是没有在数据库中添加数据库服 ...
- 关于Android app的launcher图标更换后,仍然显示默认的ic_launcher图标的解决方法
<h1>概要</h1>在做手机适配的时候,遇到了一个很奇怪的问题,在1080x720的手机可以正常显示替换的ic_launcher.png图标,但是在1920x1080的手机上 ...
- jauery table
$("#tableData tr:gt(0)").each(function() { }//橘色部分是查找id为tableData的DataTable里面除第一行以外的行
- Java实现时间日期格式转换示例
package com.hanqi.util; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...
- 关于matlab曲线拟合的问题
matlab 曲线拟合工具箱,app->curve fitting 可以使用generate直接产生代码,生成的是函数 该函数直接返回的结果为cfit格式,直接读取不了,网上有网友说可以采用y ...
- ARDUINO W5100 WebClient 测试
基础工作:W5100扩展板插在ARDUINO上.用网线把W5100和自己家的路由器连接.插上网线能看到侧面网口指示灯变亮.路由器开启DHCP服务(一般都是开启的). 1.打开官方例程里面的Ethern ...
- DEV开发之控件NavBarControl
右键点击RunDesigner弹出如下界面鼠标先点击3或4,1,,然后点击1或2进行相应的新增或删除操作,3是分组,4是项目,4可以直接拖动到相应的分组3.属性caption:显示的名称4.NavBa ...
- tomcat异常处理经验汇总
1.Https: Feb 21, 2018 5:22:02 PM org.apache.coyote.AbstractProtocol initSEVERE: Failed to initialize ...