[表] 2022.8.13 闲话

[表] [里]


SoyTony 胁迫我用他的歌词:

《El Perdón》

Dime si es verdad...

Me dijeron que te estas casando

Tú no sabes lo que estoy sufriendo

Esto te lo tengo que decir

Cuéntame

Tu despedida para mi fue dura

Será que te llevo a la luna

Y yo no supe hacerlo así

Te estaba buscando

Por las calles gritando

Eso me está matando oh no

Te estaba buscando

Por las calles gritando

Como un loco tomando oh...

Es que yo sin ti

Y tu sin mi

Dime quién puede ser feliz

Esto no me gusta

Esto no me gusta

Es que yo sin ti

Y tu sin mi

Dime quién puede ser feliz

Esto no me gusta

Esto no me gusta

Y yo sin ti

No aguanto más

Por eso vengo a decirte lo que siento

Estoy sufriendo en la soledad

Y aunque tu padre no aprobó esta relación

Yo sigo insistiendo a pedir perdón

Lo único que importa está en tu corazón

Te estaba buscando

Por las calles gritando

Esto me esta matando oh no

Te estaba buscando

Por las calles gritando

Como un loco tomando oh...

Es que yo sin ti

Y tu sin mi

Dime quién puede ser feliz

Esto no me gusta

Esto no me gusta

Es que yo sin ti

Y tu sin mi

Dime quién puede ser feliz

Esto no me gusta

Esto no me gusta

Yo te juré a ti eterno amor

Y ahora otro te da calor

Cuando en las noches tienes frío oh oh

Yo se que el te parece mejor

Pero yo estoy en tu corazón

Y por eso pido perdón

Es que yo sin ti

Y tu sin mi

Dime quién puede ser feliz

Esto no me gusta

Esto no me gusta

Es que yo sin ti

Y tu sin mi

Dime quién puede ser feliz

Esto no me gusta oh yeah...

Dicen que uno no sabe lo que tiene (que tu sin mi)

Hasta que lo pierde, pero... (y yo sin ti)

Vale la pena luchar por lo que uno quiere (no puedo vivir así)

Y hacer el intento (no quiero vivir así)

……

基于定向边的无向图三 / 四元环计数

重定向

定义:无向图的 \(k\) 元环指无向图中某个大小为 \(k\)边集 \(E=\{e_1,e_2,\cdots,e_k\}\),满足 \(v_{e_i}=u_{e_{i+1}}\)\(e_{k+1}=e_1\) .

我们考虑将无向图的边集重新定向,对于一组点 \(u\leftrightarrow v\),我们强制令度数小的点连向度数大的点,当然如果两个点度数一样,那么为了保证这 \(n\) 个点形成严格的偏序关系,我们令编号小的点连向编号大的点 .

这样我们生成的图有一个性质是每个点的出度是 \(O(\sqrt m)\) 级别的 .

证明考虑任意一点 \(u\) 在原图中度数与 \(\sqrt m\) 的大小关系即可 .

无向图三元环计数

显然对于一个三元环 \((a,b,c)\),在定向后的图中它必然形如 \(a\to b\)\(b\to c\)\(c\to a\),则暴力枚举 \(a\)\(a\) 的出边指向的点 \(b\),再暴力枚举 \(b\) 的出边指向的点 \(c\),然后判一下是否存在边 \(a\to c\) 即可 .

如此暴力的算法复杂度其实是科学的,注意到暴力枚举 \(a\to b\)

  1. \(a\to b\to c\)\(a\to d\to c\) .
  2. \(a\to b\to c\to d\)\(a\to d\) .
  3. \(a\to b\gets c\to d\)\(a\to d\) .

分别考虑一下:

  • 情况 1:枚举 \(a\),记以 \(c\) 结尾的满足存在边 \(a\to b\to c\) 的点 \(b\) 个数为 \(f_c\),那么当前四元环个数即为 \(\displaystyle\sum\dbinom{f_c}2\)\(f\) 可以枚举 \(c\) 的预处理一下, \(O(m\sqrt m)\) .
  • 情况 2:枚举 \(b\),那么就可以将四元环拆成两个基本模型 \(b\to c\to d\)\(b\gets a\to d\),分别 \(O(m\sqrt m)\) 枚举的,然后组合一下,记两部分个数分别为 \(f_d\)\(g_d\),那么当前四元环个数就是 \(\displaystyle\sum f_dg_d\)\(O(m\sqrt m)\) .
  • 情况 3:枚举 \(b\),也可以将四元环拆成两个基本模型 \(b\gets c\to d\)\(b\gets a\to d\),后面类似,不过这里 \(b,d\) 地位相同,所以算出来要除以 2,\(O(m\sqrt m)\) .

情况 2,3 不用情况 1 的方法是因为定向后的图入度没有任何性质 .

三种情况都是 \(O(m\sqrt m)\) 的,所以总复杂度也是 \(O(m\sqrt m)\) .

基于 word-RAM model 下 bitmap 的三 / 四元环计数

word-RAM model

word-RAM model 大概就是一个 int 用 4 Byte,也就是 32-bit,这种 .

于是我们按位存储一个 01 序列(32 位压缩进一个 int),这样就能做到 \(\dfrac1{32}\) 常数 .

这个 \(32\) 就是 word-RAM model 的 word,后面记作 \(w\) .

如果我们用 64-bit 机,那么 \(w\) 就是 \(64\) .

最常见的基本就是这两个了 .


关于 bitmap,就是我们上面所说的「按位存储一个 01 序列」.

C++ 中的 std :: bitset 提供了一个 bitmap 结构的实现 .

三元环计数

无向图:对于每个点 \(u\),我们开一个 bitset 记录一下与 \(u\) 邻接的所有点,于是枚举两个点 \(u,v\),把它们的 bitset 暴力并起来即可 .

时间复杂度 \(O(n^3/w)\),空间复杂度 \(O(n^2/w)\) .

有向图类似 .

四元环计数

仍然以无向图举例,还是对于每个点 \(u\),我们开一个 bitset 记录一下与 \(u\) 邻接的所有点,于是枚举两个点 \(u,v\),把它们的 bitset 暴力并起来得到 \(B\),这样我们在 \(B\) 里找两个元素就可以构成一个四元环 .

这个就是 \(\dbinom{|B|}2\),时间复杂度 \(O(n^3/w)\),空间复杂度 \(O(n^2/w)\) .

有向图细节多一点,不过也是类似 .

特殊图三元环计数

完全图与竞赛图

完全图就是组合数,略 .

竞赛图三元环计数:首先单步容斥,总共有 \(\dfrac n3\) 个三元组 .

枚举一个点 \(u\) 以及和它邻接的 \((v,w)\),使得 \((u,v,w)\) 不能构成三元环 .

显然这样的三元组只会在 \(u\) 被枚举到一次 .

所以总的三元环个数为 \(\displaystyle\dbinom n3-\sum_{i=1}^n\dbinom{out_i}2\)\(out_i\) 是出度 .

看完这个可以试一下竞赛图三元环期望 .


感觉想到的特殊图上做三元环计数都很 naive 啊……有人给个 idea 嘛?

例题

三元组与旧试题

「2017 山东一轮集训 Day6」三元组

给三个正整数 \(a,b,c\),求

\[f(a,b,c)=\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c[i\perp j][j\perp k][k\perp i] \]

\(a,b,c\le 50000\) .

首先莫反一下:

\[\begin{aligned}f(a,b,c)&=\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c[i\perp j][j\perp k][k\perp i]\\&=\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c\sum_{x\mid\gcd(i,j)}\sum_{y\mid\gcd(j,k)}\sum_{z\mid\gcd(k,i)}\mu(x)\mu(y)\mu(z)\\&=\sum_x\sum_y\sum_z\mu(x)\mu(y)\mu(z)\left\lfloor\dfrac{a}{\operatorname{lcm}(x,y)}\right\rfloor\left\lfloor\dfrac{b}{\operatorname{lcm}(y,z)}\right\rfloor\left\lfloor\dfrac{c}{\operatorname{lcm}(z,x)}\right\rfloor\end{aligned} \]

发现当 \(\mu(x)\)\(\mu(y)\)\(\mu(z)\) 都非零,且 \(\max\{\operatorname{lcm}(x,y),\operatorname{lcm}(y,z),\operatorname{lcm}(z,x)\}\le\max(a,b,c)\) 时才有贡献,打表可以得到 \(50000\) 以内的 square-free number 共有 \(10008\) 个,而其中足 \(\operatorname{lcm}(x,y)\le50000\) 的二元组 \((x,y)\) 只有 \(10^5\) 级别 .

于是考虑把每个 square-free number 看做点,若 \(\operatorname{lcm}(u,v)\le\max\{a,b,c\}\) 则连边 \(u\leftrightarrow v\),这样问题就变成了找原图的三元环个数了 .

还需要花 \(3!\) 的复杂度枚举三元环哪三个点分别对应 \(x,y,z\),并且三元环不能有重复,我们还需要单独处理两个相同和一个相同的贡献 .


「SDOI2018」旧试题

给三个正整数 \(a,b,c\),求

\[f(a,b,c)=\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^cd(ijk) \]

\(a,b,c\le 50000\) .

讨论每个素因子的贡献可得 \(\displaystyle d(ijk)=\sum_{x\mid i}\sum_{y\mid j}\sum_{z\mid k}[x\perp y][y\perp z][z\perp x]\) .

莫反过程和三元组差不多,最后化出来是

\[\sum_x\sum_y\sum_z\mu(x)\mu(y)\mu(z)S\left(\left\lfloor\dfrac{a}{\operatorname{lcm}(x,y)}\right\rfloor\right)S\left(\left\lfloor\dfrac{b}{\operatorname{lcm}(y,z)}\right\rfloor\right)S\left(\left\lfloor\dfrac{c}{\operatorname{lcm}(z,x)}\right\rfloor\right) \]

其中 \(S\)Divisor Summatory Function .

剩下的就是三元环计数了,听说比较卡常 .

直接维护

Tourist Attractions

给一个无向图,问有多少简单路径恰好经过四个点 .

枚举两个点和它们的出边,这样可以组成一个长度为 4 的路径 .

为了保证简单,需要去掉两个点相同的情况,实际上这就是三元环计数 .

都可以 bitmap,\(O(n^3/w)\) .


Cakes

一个无向图,每个点 \(u\) 有点权 \(a_u\),对于一个三元环 \((i,j,k)\),产生 \(\max\{a_i,a_j,a_k\}\) 的贡献 .

问产生多少贡献 .

三元环计数的时候顺便维护一下即可,\(O(m\sqrt m)\) .


Team Players,比较有挑战性的题,可以看看 .


绝世好题:二分图七元环计数 .

posted @ 2022-08-13 19:40  Jijidawang  阅读(117)  评论(0编辑  收藏  举报
😅​