这道题,先说一下单色三角形吧,推荐一篇noip的论文《国家集训队2003论文集许智磊》

链接:https://wenku.baidu.com/view/e87725c52cc58bd63186bd1b.html?from=search

单色三角形指的是n个顶点,有n(n-1)条边,很明显是每个点两两相连,那么这样所形成的所有三角形的边假如有两种颜色:红和黑。那么问一共有多少三角形的三边是一种颜色的个数。

,建议看一下那个论文,因为我只能直接给出你结论。  下面的数学符号:{...}为概率论中表示事件的符号(集合),|{...}| 表示集合的元素个数。

如图,可知  |{ 单色三角形事件 } |  =|{ 所有三角形 }| - |{ 非单色三角形  }|   很容易得 | { 所有三角形 } | = C3n=n(n-1)(n-2)/6;  那么就直接把| { 非单色三角形 } |求出来。

如图:非单色三角形有的情况和的情况, 但是无疑都存在两个顶点所连接的两个边都是异色。那么,我们就将这个图抽象成n个这样类似的图那么,如果知道顶点 i 的红色边 ai 的话, 那么 黑色边就是 n-1-ai, 那么,| { 包含 i 顶点的非单色三角形 } |=ai(n-1-ai);  那么,由加法原理得   | { 非单色三角形 } | = ∑ai(n-1-ai);

这样就可以计算出,所有单色三角形的个数了。


那么,我们先看看这个题的特性(ai, aj, ak){i<j<k}  S={ 满足两两互质,或者两两不互质 }。是不是相当于边的颜色为红色和为黑色呢?那么,ai  就相当于顶点

假如,我们已经知道了ai 与那些所给的数据 不互质的个数 bi 。(我们先说不互质的情况。至于为什么,一会下面理解了莫比乌兹反演就知道了。)

那么,|S|=|{ 所有(ai,aj, ak)的任意组合 }| - |{ !S }|    (!S表示S的反 )

还是,把重点放在| {!S} |  上,刚刚,我们是假设已知那些数据与ai不互质的个数bi, 但是怎么得到bi就涉及到另一个重大的问题。


莫比乌斯反演——容斥原理。

其实,这道题加深了我个人对莫比乌斯的理解吧。

都知道一般容斥原理的公式,|S1+S2+S3+S4+S5.....+Sk|=∑(-1)(n-1)∏(Sx...Sy)  (不知道的自己百度)

这个公式,用文氏图非常明显,是任何时间(集合)的子集之间的相互关系的一种,当然也是定义讲的好。

那么,数论呢?其实,它也有像一般容斥的公式,它就是莫比乌斯反演。只不过,它的集合就是以所有数为元素的集合,处理的对象很多是(x, y)这样的数对。


回到题上:当转化为gcd(ai,aj)=k, 那么,我们可以在数据ai中找出最大值max,得到一个k的范围 [ 1, max], 先记录枚举当数据ai中质数因子为k的个数,记录为 mk。这样就得到了[ 1, max ]为质因子的数的个数{m}。

这时,把 gcd(x, y)!=1 这个拿出来,由x, y的唯一质数分解得,∑|{gcd(x, 1)=1}|-∑| {gcd(x,y)=k} | +∑|{gcd(x, y)=n*m}|-∑|{gcd(x, y)=nmh}|....=∑u(d)F(n/d);  (感觉这里写的有些毛病。)

ac代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn = 1e5 + ;
int a[maxn];
int vis[maxn];
int mu[maxn];
int prime[maxn]; void mobius()
{
mu[] = ;
int cnt = ;
for (int i = ; i < maxn; ++i)
{
if (!vis[i]){ prime[cnt++] = i; mu[i] = -;}
for (int j = ; j < cnt&&prime[j] * i < maxn; ++j)
{
vis[prime[j] * i] = ;
if (i%prime[j] == ){ mu[prime[j] * i] = ; break; }
mu[prime[j] * i] = -mu[i];
}
}
}
int maxx;
ll n, hz[maxn], num[maxn]; void solve()
{
memset(hz, , sizeof(hz));
memset(num, , sizeof(num));
for (int i = ; i <= maxx; ++i)
{
for (int j = i; j <= maxx; j += i) //寻找i的倍数的个数
num[i] += vis[j];
for (int j = i; j <= maxx; j += i)
hz[j] += mu[i] * num[i];
}
ll ans = ;
for (int i = ; i < n; ++i)
{
if (a[i] != )
{
ans += 1LL*(hz[a[i]]*(n - - hz[a[i]]));
}
}
ans = n*(n - ) * 1LL * (n - ) / - ans / ;
printf("%lld\n", ans);
} int main()
{
int t;
scanf("%d", &t);
mobius();
while (t--)
{
memset(vis, , sizeof(vis));
memset(a, , sizeof(a));
scanf("%lld", &n);
maxx = ;
for (int i = ; i < n; ++i)
{
scanf("%lld", &a[i]);
++vis[a[i]];
maxx = max(maxx, a[i]);
}
solve();
}
}

Coprime (单色三角形+莫比乌斯反演(数论容斥))的更多相关文章

  1. 洛谷 P2522 [HAOI2011]Problem b (莫比乌斯反演+简单容斥)

    题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...

  2. JZYZOJ1518 [haoi2011]b 莫比乌斯反演 分块 容斥

    http://172.20.6.3/Problem_Show.asp?id=1518最开始只想到了n^2的写法,肯定要超时的,所以要对求gcd的过程进行优化.首先是前缀和容斥,很好理解.第二个优化大致 ...

  3. [模板] 容斥原理: 二项式反演 / Stirling 反演 / min-max 容斥 / 子集反演 / 莫比乌斯反演

    //待更qwq 反演原理 二项式反演 若 \[g_i=\sum_{j=1}^i {\binom ij} f_j\] , 则有 \[ f_i=\sum_{j=1}^i (-1)^{i-j} {i \ch ...

  4. 【LOJ#6374】网格(二项式反演,容斥)

    [LOJ#6374]网格(二项式反演,容斥) 题面 LOJ 要从\((0,0)\)走到\((T_x,T_y)\),每次走的都是一个向量\((x,y)\),要求\(0\le x\le M_x,0\le ...

  5. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  6. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)

    [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...

  7. POJ 1150 The Last Non-zero Digit 数论+容斥

    POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: id=1150" rel="nofollow" style="colo ...

  8. HDU 5072 Coprime (单色三角形+容斥原理)

    题目链接:Coprime pid=5072"> 题面: Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  9. BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块

    问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...

随机推荐

  1. ARM常用汇编指令列表 --- 转自百度文库

  2. 数据库部分(MySql)_1

    SQL规范 以 “ ; ” 结尾:关键字之间要有空格(可以由多个空格):SQL语句中可以一个或多个换行:关键字不区分大小写. 数据库相关SQL 查询所有数库库: show databases; 创建数 ...

  3. 【Java并发编程】19、DelayQueue源码分析

    DelayQueue,带有延迟元素的线程安全队列,当非阻塞从队列中获取元素时,返回最早达到延迟时间的元素,或空(没有元素达到延迟时间).DelayQueue的泛型参数需要实现Delayed接口,Del ...

  4. 【shell编程】1、shell编程简介

    Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释 ...

  5. 设计模式之命令模式(Command )

    命令模式是我们能够实现发送者和接收者之间的完全解耦,发送者是调用操作的对象,而接收者是接收请求并执行特定操作的对象.通过解耦,发送者无需了解接收者的接口.在这里,请求的含义是需要被执行的命令. 作用 ...

  6. 洛谷P3721 [AH2017/HNOI2017]单旋(线段树 set spaly)

    题意 题目链接 Sol 这题好毒瘤啊.. 首先要观察到几个性质: 将最小值旋转到根相当于把右子树变为祖先的左子树,然后将原来的根变为当前最小值 上述操作对深度的影响相当于右子树不变,其他的位置-1 然 ...

  7. 2017-12-01 中英文代码对比之ZLOGO 4 & LOGO

    基于前文中文编程语言之Z语言初尝试: ZLOGO 4的一些评论, 此文尝试作一个非常简单的代码对比, 使讨论更加有实例根据. 下图是节选自前文最后的示例代码, 由于选取的对照LOGO版本 (alanc ...

  8. React-classnames库

    今天在项目中看到了大佬引入了classnames,之前没用过所以去搜了搜,感觉还真的是挺好用的,搜到一篇很不错的文章,跟原创作者交流了一下就转载过来了! 下面废话不多说,我们直接来看文章吧 首先我们我 ...

  9. React中props和state相同点和不同点

    朋友们,我想死你们了,最近这几天忙着和病魔作斗争所以没怎么写博客,今天感觉好点了,赶紧来写一波,就是这木敬业. 今天我们来讨论讨论props和state相同点和不同点 首先我来概要说明一下这两者 pr ...

  10. Maven 安装 on centos7

    本文演示如何在CentOS7上安装maven. 1 准备工作 1.1 进入官网下载栏目 http://maven.apache.org/download.cgi 找到下载列表中 Binary tar. ...