题意:

给出\(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$的倍数的个数。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <vector>
  6. using namespace std;
  7. typedef long long LL;
  8. const int maxn = 100000;
  9. int mu[maxn + 10], pcnt, prime[maxn];
  10. bool vis[maxn + 10];
  11. vector<int> factors[maxn + 10];
  12. void preprocess() {
  13. pcnt = 0;
  14. mu[1] = 1;
  15. for(int i = 2; i <= maxn; i++) {
  16. if(!vis[i]) {
  17. mu[i] = -1;
  18. prime[pcnt++] = i;
  19. }
  20. for(int j = 0; j < pcnt && i * prime[j] <= maxn; j++) {
  21. vis[i * prime[j]] = true;
  22. if(i % prime[j] != 0) mu[i * prime[j]] = -mu[i];
  23. else {
  24. mu[i * prime[j]] = 0;
  25. break;
  26. }
  27. }
  28. }
  29. for(int i = 2; i <= maxn; i++) if(mu[i])
  30. for(int j = i; j <= maxn; j += i) factors[j].push_back(i);
  31. }
  32. int n, a[maxn + 10], cnt[maxn + 10];
  33. int main()
  34. {
  35. preprocess();
  36. int T; scanf("%d", &T);
  37. while(T--) {
  38. scanf("%d", &n);
  39. memset(cnt, 0, sizeof(cnt));
  40. for(int i = 0; i < n; i++) {
  41. scanf("%d", a + i);
  42. for(int d : factors[a[i]]) cnt[d]++;
  43. }
  44. LL ans = 0;
  45. for(int i = 0; i < n; i++) {
  46. LL coprime = n;
  47. for(int d : factors[a[i]]) coprime += mu[d] * cnt[d];
  48. if(a[i] == 1) coprime--;
  49. ans += coprime * (n - 1 - coprime);
  50. }
  51. ans >>= 1;
  52. LL tot = (LL)n * (n-1) * (n-2) / 6;
  53. printf("%lld\n", tot - ans);
  54. }
  55. return 0;
  56. }

LA 7048 Coprime 莫比乌斯反演的更多相关文章

  1. nyoj CO-PRIME 莫比乌斯反演

    CO-PRIME 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 This problem is so easy! Can you solve it? You are ...

  2. 【CodeForces】915 G. Coprime Arrays 莫比乌斯反演

    [题目]G. Coprime Arrays [题意]当含n个数字的数组的总gcd=1时认为这个数组互质.给定n和k,求所有sum(i),i=1~k,其中sum(i)为n个数字的数组,每个数字均< ...

  3. 【CodeForces】915 G. Coprime Arrays 莫比乌斯反演,前缀和,差分

    Coprime Arrays CodeForces - 915G Let's call an array a of size n coprime iff gcd(a1, a2, ..., *a**n) ...

  4. CF915G Coprime Arrays (莫比乌斯反演)

    CF915G Coprime Arrays 题解 (看了好半天终于看懂了) 我们先对于每一个i想,那么 我们设 我们用莫比乌斯反演 有了这个式子,可比可以求出△ans呢?我们注意到,由于那个(i/d) ...

  5. Coprime (单色三角形+莫比乌斯反演(数论容斥))

    这道题,先说一下单色三角形吧,推荐一篇noip的论文<国家集训队2003论文集许智磊> 链接:https://wenku.baidu.com/view/e87725c52cc58bd631 ...

  6. CF915G Coprime Arrays 莫比乌斯反演、差分、前缀和

    传送门 差分是真心人类智慧--完全不会 这么经典的式子肯定考虑莫比乌斯反演,不难得到\(b_k = \sum\limits_{i=1}^k \mu(i) \lfloor\frac{k}{i} \rfl ...

  7. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. POI2007_zap 莫比乌斯反演

    题意:http://hzwer.com/4205.html 同hdu1695 #include <iostream> #include <cstring> #include & ...

  9. acdream 1148 GCD SUM 莫比乌斯反演 ansx,ansy

    GCD SUM Time Limit: 8000/4000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatis ...

随机推荐

  1. Vue2之页面 、js 、css分离

    在编写vue的时候,页面数据少的时候,可以将所有的js和css都可以直接写在页面上,但是页面数据多,js.css的方法和样式多的时候,都放在一个页面的时候,就显得页面vue十分的臃肿. 所以写项目的时 ...

  2. 1143 纪念品分组 2007年NOIP全国联赛普及组

    1143 纪念品分组 2007年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解  查看运行结果     题目描述 Descri ...

  3. Redis数据库2

    一.存储list 1.概述     list类型是按照插入顺序排序的字符串链表,可以在头部(left)和尾部(right)添加新的元素,如果不存在,则自动创建;如果list中所有元素被移除,则list ...

  4. iOS-Swift相比Objective-C有哪些优缺点

    Swift,是苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序.它是一款易学易用的编程语言,而且 ...

  5. Windows使用MySQL数据库管理系统中文乱码问题

    声明:本文关于MySQL中文乱码问题的解决方案均基于Windows 10操作系统,如果是Linux系统会有较多不适用之处,请谨慎参考. 一.MySQL中文乱码情况 1. sqlDevelper远程登陆 ...

  6. AdonisJs(Node框架)学习总结

    先列出作为前端开发人员必须知道的10个NodeJs框架  AdonisJs 一个服务端渲染的MVC框架,它是 Laravel (PHP框架)的一个 NodeJS 版本. 可以安装脚手架工具adonis ...

  7. 【TensorFlow入门完全指南】基本操作

    众所周知我暂时弃掉了那个音乐生成的坑,原因是我的代码写得还不够纯熟…… 现在我找到了一个项目,用来从代码基础开始补起,同时写下学习笔记. 项目地址:https://github.com/aymeric ...

  8. 2018.2.25 关于JavaScript

    关于JavaScript 1.数组的归约函数reduce(function(PREV,CUR,I){})会从做导游进行迭代,每次返回的值为下一次的prev参数. 2.在循环遍历数组时若是想在找到结果后 ...

  9. Stream great concerts wherever you are

    This time of year, we take stock of what we're thankful for — and above all else, we’re thankful for ...

  10. SC || Git 相关知识

    发现大佬的博客:https://www.cnblogs.com/onetwo/p/4157610.html 注:图片来自小姐姐的笔记~ ┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉┉┉┉∞ ∞┉┉┉┉∞ ...