LA 7048 Coprime 莫比乌斯反演
2015-10-25 00:17
302 查看
题意:
给出\(n(n \leq 10^5)\)个数字\(a_i(a_i \leq 10^5)\),从中选出\(3\)个数,使得这\(3\)个数两两互质或者两两不互质分析:
可以说这是《训练指南》\(P_{105}\)上问题\(6\)的原题。将\(n\)个数看成\(n\)个顶点,如果两数互质连一条白边,不互质连一条黑边。
那么我们要计数的就是单色三角形的个数。
从\(n\)个数中选\(3\)个数,一共有\(C_n^3\)种方案,正面不容易计算所以我们反面计算非单色三角形的个数。
在一个非单色三角形中,恰好有两个顶点连接两条异色边。
而且有公共顶点的两条异色边对应一个非单色三角形。
假设与\(a_i\)互质的数字的个数为\(b_i\)(相当于连了\(b_i\)条白边),那么与\(a_i\)不互质的数字的个数为\(n-1-b_i\)(连了\(n-1-b_i\)条黑边)
每个非单色三角形被计算了两次,所以对应的个数为$ \frac {1} {2} \sum{b_i (n-1-b_i)}$
最后单色三角形的个数就是\(C_n^3\)减去非单色三角形的个数。
关于计算与\(a_i\)互质的数字的个数,根据莫比乌斯反演公式有 $ \sum{\mu(d) cnt_d, (d | a_i)} \(,其中\)cnt_d\(为\)d$的倍数的个数。
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> using namespace std; typedef long long LL; const int maxn = 100000; int mu[maxn + 10], pcnt, prime[maxn]; bool vis[maxn + 10]; vector<int> factors[maxn + 10]; void preprocess() { pcnt = 0; mu[1] = 1; for(int i = 2; i <= maxn; i++) { if(!vis[i]) { mu[i] = -1; prime[pcnt++] = i; } for(int j = 0; j < pcnt && i * prime[j] <= maxn; j++) { vis[i * prime[j]] = true; if(i % prime[j] != 0) mu[i * prime[j]] = -mu[i]; else { mu[i * prime[j]] = 0; break; } } } for(int i = 2; i <= maxn; i++) if(mu[i]) for(int j = i; j <= maxn; j += i) factors[j].push_back(i); } int n, a[maxn + 10], cnt[maxn + 10]; int main() { preprocess(); int T; scanf("%d", &T); while(T--) { scanf("%d", &n); memset(cnt, 0, sizeof(cnt)); for(int i = 0; i < n; i++) { scanf("%d", a + i); for(int d : factors[a[i]]) cnt[d]++; } LL ans = 0; for(int i = 0; i < n; i++) { LL coprime = n; for(int d : factors[a[i]]) coprime += mu[d] * cnt[d]; if(a[i] == 1) coprime--; ans += coprime * (n - 1 - coprime); } ans >>= 1; LL tot = (LL)n * (n-1) * (n-2) / 6; printf("%lld\n", tot - ans); } return 0; }
相关文章推荐
- 软件架构师应该知道的97件事之概括91-97
- 在centos使用rpm包的方式安装mysql,以及更改root密码
- mysql 第22章 高可用MMM、MHA
- 无法完成请求,因为找到不知名的或无效的JPEG标志符类型。 Adobe Photoshop CS5
- QT Creator 加 apxs 搭建Apache模块开发环境
- linux sed指令 sed 's/^\n/&\n/g'
- linux驱动设备号的注册
- 最近看到一个很不错的特效网站
- Apache的ab工具
- 10个基于DOCKER的顶尖开发工具
- 使用Docker打包Java/Spring Boot应用
- Linux vmstat
- 《Unix & Linux 大学教程》 - 第一、二章 学习笔记
- 《Unix & Linux 大学教程》 - 第一、二章 学习笔记
- VS2013下使用OpenCV2.4.9打开摄像头并且显示
- 自定义popWindow
- 软件架构师应该知道的97件事之概括76-90
- Linux进程管理
- linux远程登录ssh免密码配置方法
- 避免Time Machine备份Parallels Desktop的HDD虚拟硬盘文件