[MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题

[MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题

题目描述

东风谷 早苗(Kochiya Sanae)非常喜欢幽灵乐团的演奏,她想对她们的演奏评分。

因为幽灵乐团有 3 个人,所以我们可以用 3 个正整数 A,B,C 来表示出乐团演奏的分数,她们的演奏分数可以表示为

i=1Aj=1Bk=1C(lcm(i,j)gcd(i,k))f(type)

因为音乐在不同的部分会有不同的听觉感受,所以 type 会在 {0,1,2} 中发生变化,其中:

f(0)=1f(1)=i×j×kf(2)=gcd(i,j,k)

因为乐团的歌实在太好听了,导致分数特别高,所以她们的分数要对给定的正整数 p 取模。

因为有很多歌曲要演奏,所以早苗给出了 T 组询问。
对于 100% 的数据:

1A,B,C105    107p1.05×109    p{prime}    T=70

思路点拨

主要还是根据我的 莫反套路 来进行推导。真的十分经典,可以看一看(广告)

先看到原式,这个式子可以使用 lcm(i,j)=ijgcd(i,j)

i=1Aj=1Bk=1C(lcm(i,j)gcd(i,k))f(type)=i=1Aj=1Bk=1C(ijgcd(i,j)gcd(i,k))f(type)

因为是模意义下的乘法,所以我们分子分母可以简答合并一下,那么就是:

i=1Aj=1Bk=1C(ij)fi=1Aj=1Bk=1Cgcd(i,j)gcd(i,k)f

至此操作很常规,和一道叫 product 的莫反题一样。

然后我们考虑分子和分母,这又可以拆分:

i=1Aj=1Bk=1C(ij)f=i=1Aj=1Bk=1Cifi=1Aj=1Bk=1Cjf

这都差不多,一下只讲解左边一半 i=1Aj=1Bk=1Cif

分母差不多,也只讲解左边一半,右边是一样的。

i=1Aj=1Bk=1Cgcd(i,j)f

type 三种,没有什么太大关联,所以分开讲解了。

type=0

这部分幼儿园随便写。前提是看了我的博客(广告推销)
此时 f=1 。十分的人性化,但是分数很少。

先讲最简单的分子(还是再讲一遍,我们分子分母都只讲一半,另一半是一样的):

=i=1AiBC

O(n) 阶乘快速幂直接过。分母也很简单:

=i=1Aj=1Bk=1Cgcd(i,j)

k 没有什么太大关系啊,我们算 i=1Aj=1Bgcd(i,j) ,带上 C 的幂就可以了。

看到这种式子,我们也是使用技巧(可以看一下上面的博客,广告):枚举 gcd ,然后式子就可以转化:

d=1Adi=1Aj=1B[gcd(i,j)=d]

先考虑一下幂:

i=1Aj=1B[gcd(i,j)=d]=i=1Adj=1Bd[gcd(i,j)=1]

现在我们可以莫反:

i=1Adj=1Bdk=1iμ(k)[k|i][k|j]

我们进而枚举 k

k=1Adμ(k)AkdBkd

我们集合 kd ,直接释放奥义 T=kd ,带回原式枚举 T

d=1Adk=1Adμ(k)AkdBkd=T=1A(d|Tdμ(Td))ATBT

而中间括号内的部分 O(nlogn) 预处理一下。富比尼定理枚举 T ,时间复杂度 O(T(AlogAB)+nlogn) 。大抵是可以过的罢。

这部分推出来是很基础的。

type=1

这部分还是偏简单。
分子有点侮辱智商,我们直接写出答案:

i=1Aii×B(1+B)C(1+C)4

考虑分母:

=i=1Aj=1Bk=1Cgcd(i,j)ijk

k 没有多大关系,所以直接提出去:

=(i=1Aj=1Bgcd(i,j)ij)(1+C)C2

考虑括号内的数,使用技能 枚举 gcd :

=d=1Adi=1Aj=1Bij[gcd(i,j)=d]

=d=1Add2i=1Adj=1Bdij[gcd(i,j)=1]

使用莫比乌斯反演:

=d=1Add2k=1Adk2μ(k)(1+Akd)Akd2(1+Bkd)Bkd2

现在我们使用三界魔法 T=kd 对其绝杀:

=d=1Ak=1Addd2k2μ(k)(1+Akd)Akd2(1+Bkd)Bkd2

=T=1A(d|Tdμ(Td))(1+AT)AT2(1+BT)BT2×T2

实现一样的,括号内预处理,其余的富比尼定理优化一下就可以了。时间复杂度和 type=0 是一样的。

type=2

这部分是很有挑战的了,我目前没有推出分母。但是分子是比较简单的。

我们按照套路,枚举一下 gcd(i,j,k)

=i=1Aj=1Bk=1Cigcd(i,j,k)

底数至于 i 有关,直觉提前 i

=i=1Aij=1Bk=1Cgcd(i,j,k)

幂的部分拎出来先,这部分的 Latex 比较复杂,如果还是像 type=1 的样子写我会去世的。

j=1Bk=1Cgcd(i,j,k)=d|idj=1Bdk=1Cd[gcd(id,j,k)=1]

开始莫反:

=d|idk|idBdμ(k)BkdCkd

我们发动三阶魔法 T=kd ,对其进行推导(血条太厚了,没有终结掉):

=T|iBTCT(d|Tdμ(Td))

括号内什么筛法预处理就可以了,再做一个前缀和。其余的部分富比尼定理优化计算。O(Tn)

posted @   Diavolo-Kuang  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示