奇妙反演

update:

  • 2024.12.11 重新整理了 二项式反演

1. 反演的定义

反演就是从 g 表示 f 变为从 f 表示 g

当已知 f(n)=i=1ncn,ig(i) 时。若可以推出 g(n)=i=1ndn,if(i) 时,可以由 f 推出 g

则称这两式互为反演公式。

利用反演的本质是由于其反演后的 f(n) 较容易得到,进而反演出 g(n)

2. 二项式反演

2.1 概念

从容斥原理开始。
我们假设有 n 个集合 {S1,S2,...,Sn1,Sn},设全集为 U,且其中任意 i 个集合的交集,并集的大小都相等

我们设 g(x) 是任意 x 个元素的交集大小f(x) 是任意 x 个元素补集的交集大小

普通容斥原理就是

|i=1nSi|=(1)|T|1|i=1|T|STi|

我们设 |Si| 的补集为 |Si|。则

|i=1nSi|=|U||i=1nSi|

|i=1nSi|=|U||i=1nSi|

类似的可以得到

|i=1nSi|=|U||i=1nSi|

我们把 f(0)g(0) 设为 |U|。则

f(n)=|i=1nSi|=|U||i=1nSi|=|U|+(1)|T||i=1|T|STi|=i=0n(1)i(ni)g(i)

g(n)=|U|(1)|T|1|i=1|T|STi|=|U|+(1)|T||i=1|T|STi|=i=0n(1)i(ni)f(i)

我们就得到了优美的初始二项式反演式子:

f(n)=i=0n(1)i(ni)g(i)g(n)=i=0n(1)i(ni)f(i)

适当转换一下:

f(n)=i=0n(ni)g(i)g(n)=i=0n(1)ni(ni)f(i)

再变一下:

f(n)=i=mn(ni)g(i)g(n)=i=mn(1)ni(ni)f(i)

最后可以得到最常用的式子:

f(n)=i=nm(in)g(i)g(n)=i=nm(1)in(in)f(i)

证明:将右式代入左式得:

f(n)=i=nm(in)j=im(1)ji(ji)f(j)=i=nmj=imf(j)(1)ji(ji)(in)=j=nmf(j)i=nj(1)ji(jn)(jnji)=j=nm(jn)f(j)i=nj(1)ji(jnin)=j=nm(jn)f(j)i=0jn(1)jn+i(jni)=j=nm(jn)f(j)(1)jn i=0jn(1)i(jni)=j=nm(jn)f(j)(1)jn (11)jn=j=nm(jn)f(j)(1)jn[j=n]=(nn)(1)0f(n)=f(n)

利用二项式定理证明,这也是其名字的由来,得证。

注:以上四个式子都可以用上述方法证明

2.2 应用与扩展

一般来说,我们将 f(n) 表示钦定n 个,剩下的随便g(n) 表示恰好选定 n 个,则对于 in 都有 (in) 的贡献,即:

f(n)=i=nm(in)g(i)

注意,f(n) 不可被理解为至少选 n 个,不是简单的后缀和,f(n) 中的方案是有重复的,即一种方案有多种钦定方式。具体的,恰好选定 i 个的方案中,有 (in) 中钦定方式。

运用这个式子我们可以反演出 g(n) 的表达式,从而求出答案,至于 f 的求法,一般为推式子或 DP。

例题:P10596 BZOJ2839 集合计数

f(n) 表示钦定n 个的方案数,则有 f(i)=(ni)(22ni1),钦定后所有包含 i 个元素的集合有 2ni 个。

答案就是 g(n) 表示恰好选定 n 个的方案数,有 g(n)=i=nm(1)in(in)f(i)

复杂度 O(nlogV+klogV)

代码

2.2.1 多维二项式反演

形如 f(n,m)=i=nxj=my(in)(jm)g(i,j)g(n,m)=i=nx(1)in(in)j=my(1)jm(jm)f(i,j)

2.3 例题

I P4859 已经没有什么好害怕的了

首先有若 2nk,则一定无解,否则有 n+k2ai>bi,考虑将问题转化为钦定 k 组。

考虑 DP,先排个序,设 fi,j 表示前 i 组,钦定jai>bi 的方案数,有转移:

fi,j=fi1,j+fi1,j1×x,其中 x 表示 bai 的数的个数。

F(i) 表示钦定 n 组中钦定 ia>b 的方案数,则有 F(i)=fn,i×(ni)!

反演下,得到 G(n)=i=nm(1)in(in)F(i),答案即为 G(n+k2)

复杂度 O(n2)

代码

II [ABC266G] Yet Another RGB Sequence

我们设 f(n)钦定 nrg 的方案数,有 f(n)=(R+G+Bnn)(R+G+B2nRn)(G+BnGn)

然后反演即可,复杂度 O(n)

代码

III P6076 [JSOI2015] 染色问题

三个限制,每个限制单独看都很能反演,考虑多维二项式反演。

f(n,m,k) 表示钦定 n 行不染色,m 列不染色,k 种颜色不选,则有 f(i,j,k)=(ck+1)(ni)(mj)(ni)(mj)(ck)

反演下,得到

g(n,m,k)=i=nxj=myl=kz(1)(in)+(jm)+(lk)(in)(jm)(lk)f(i,j,l)

我们要求的答案即为:

g(0,0,0)=j=0yl=0z(1)j+l(cl)(mj)i=0x(ni)(1)i(cl+1)(ni)(mj)=j=0yl=0z(1)j+l(cl)(mj)[(cl+1)mj1]n

复杂度 O(nmlogV)

代码

IV P6478 [NOI Online #2 提高组] 游戏

恰好不是很好求,转为求钦定非平局回合数为 k 的方案数,可以树形 DP O(n2) 求。

具体的,设 fi,j 表示在 i 这棵子树内钦定非平局回合数为 j 的方案数。

对于 x,若 x 不造成贡献,可以直接背包,否则设 cx,0/1 表示 x 子树内 0/1 的节点个数,有:fi,j=fi,j1×(cx,ax1j+1)

Trick,树形背包 O(n2) 写法: max(1,isizx)min(i,sizy)

对于每个询问,直接反演即可,复杂度 O(n2)

代码

V CF1228E Another Filling the Grid

裸的,可以做到 O(nlogV)

VI P10597 BZOJ4665 小 w 的喜糖

刚开始看错题了,难甭

首先,正面不是很好做,考虑有 k 个人与原来的种类数相同

f(n) 表示钦定 k 与原来相同的方案数,这样答案就为 g(0)=i=0n(1)if(i)

考虑如何求 f,设 fi,j 表示前 i 种糖钦定j 个人与原来相同,对于每一种颜色,我们枚举该颜色与原来相同的人数 k,有:

fi,j=k=0min(ci,j)fi,jk(cik)(skcik)

其中 s 表示前 ici 的和,总复杂度 O(n2)

代码

VII CF997C Sky Full of Stars

正着做比较难,考虑总数减去 恰好没有一行或一列是同一种颜色 的方案数。

f(i,j) 表示钦定 ij 列是同一种颜色,其他随意选的方案数,有:

f(i,j)={3i+j×3(ni)(nj)(ni)(nj)i=0j=03×3(ni)(nj)(ni)(nj)other

反演下我们要的是 g(0,0)=i=0n(1)i j=0n(1)jf(i,j),框里的式子先将 (ni) 提出来,得到:

=j=0n(nj)(1)j3×3(ni)(nj)31+n(ni)+3i+n(ni)=3×(3ni1)n31+n(ni)+3i+n(ni)

i=0 的单独算,最后即 3n2ans,总复杂度 O(nlogV)

代码

VIII P3270 [JLOI2016] 成绩比较

首先恰好 k 位同学被碾压不好求,考虑反演,设 f(i) 表示钦定 i 位同学被碾压的方案数,g(i) 表示恰好 i 位同学被碾压的方案数,有。

f(k)=i=kn(ik)g(i)g(k)=i=kn(1)ik(ik)f(i)

然后考虑 f(k) 怎么求,每个课程是独立的,可以先只考虑一个,最后将所有课程的方案数乘一起即可。

设当前课程最高分为 UB 神排名为 R,则除了我们钦定k 个人分数比 B 神小,还存在 n1(R1)k 个人分数比 B 神小,有 (n1knkR) 种方案,然后我们可以枚举 B 神此课程的分数,即 i=1UinR(Ui)R1,这样枚举是基于值域的,考虑怎么优化,先推下式子。

i=1UinR(Ui)R1=i=1UinRj=0R1(R1j)Uj (i)R1j=j=0R1(R1j)Uj(1)Rj1i=1Uinj1

左边可以直接枚举,右边是一些自然数次幂和的形式,可以直接拉插

前半部分复杂度是 O(n2) 的,后半部分仅与每门课程相关,复杂度 O(n3logn)

总复杂度 O(n3logn),但是这个傻子懒,拉插写的 O(n2),总 O(n4),也能过。

自己犯的几个错误:二项式定理没拆 1(上述框住的),打代码拉插的 y 没乘(难绷)。

代码

2.4 参考文章

二项式反演及其应用 - GXZlegend

反演与狄利克雷卷积 - Alex_wei

容斥与反演技巧(一)- 云浅知处

3. 莫比乌斯反演

3.4 杜教筛

4.1 杜教筛算法

一个求积性函数前缀和的优化方法 O(n23)

建议先学前面的反演知识。

杜教筛的式子是很自然的推法,首先我们假设要求 f(n) 的前缀和(一般求前缀和是为了用于整除分块),我们需要找到另一个积性函数 g,使得 g(fg) 的前缀和都很好求(例如 Iid),我们设 S(n)=i=1nf(i)

i=1n(fg)(i)=i=1nxy=ig(x)×f(y)=i=1nj=1nig(i)×f(j)=i=1ng(i)j=1nif(j)=i=1ng(i)S(ni)=g(1)S(n)+i=2ng(i)S(ni)

移一下项得:

g(1)S(n)=i=1n(fg)(i)i=2ng(i)S(ni)

右边可以整除分块,直接求时间复杂度 O(n34)

可以先预处理前 n23,再进行杜教筛,时间复杂度 O(n23)

证明:不会微积分,看不懂证明

4.2 小推柿子

  • μidk,φidk

直接卷上 idk:
(μidk)idk=(μidk)(Iidk)=(μI)idk=ϵ

(φidk)idk=(φidk)(Iidk)=(φI)idk=idk+1

  • μ2(μid)

卷上 id
μ2(μid)id=μ2ϵ=μ2

μ2 是好求的。

  • σk

由定义得: σk=d|nidk=Iidk

我们正着用杜教筛公式:

σk=Iidk=i=1nikS(ni)=i=1nikni

4.3 例题

I P4213 【模板】杜教筛

μφ 的前缀和。

我们知道 μI=ϵ,设 S(n)=i=1nμ(i)

直接运用杜教筛公式得

S(n)=i=1nϵ(i)i=2n1×S(ni)=1i=2nS(ni)

我们又知道 φI=id,设 S(n)=i=1nφ(i)

直接运用杜教筛公式得

S(n)=i=1nii=2n1×S(ni)=n(n+1)2i=2nS(ni)

预处理一下,用 mapunordered 记忆化即可。

代码

II [cogs] 3352. 平方前缀和

i=1nφ(i2)

基本上是裸的杜教筛

一个关于 φ 的性质:φ(ij)=φ(i)φ(j)gcd(i,j)φ(gcd(i,j))

证明:该式本质上是容斥,φ 的原式子是,当 n=p1c1×p2c2×···×pmck

φ(n)=n×i=1m(11pi)

这里式子就表示为先把 ij 的质因数乘上在除去 i,j共同质因数,即 φ(gcd(i,j)),最后再消掉 gcd(i,j) 即可得到该式。

然后开始推式子:

i=1nφ(i2)=i=1ni×φ(i)

不难发现该式等于 φid

(φid)id=dndφ(d)nd=n×dnφ(d)=id2

我们设 f(n)=n×φ,S(n)=i=1nf(i)

运用杜教筛公式可得:

S(n)=i=1ni2i=2niS(ni)

=n(n+1)(2n+1)6i=2niS(ni)

线性筛出前 n23 项,整除分块即可

III P3768 简单的数学题

i=1nj=1nij×gcd(i,j)

类似这样直接加上 gcd(i,j) 的式子用欧拉反演会更容易些。

i=1nj=1nij×gcd(i,j)=i=1nj=1nij×dgcd(i,j)φ(d)=d=1nφ(d)d2i=1ndi×j=1ndj=d=1nφ(d)d2(i=1ndi)2=d=1nφ(d)d2i=1ndi3

显然可以整除分块,数据范围很大,需要杜教筛。

  • 只需考虑 f(n)=d=1nφ(d)d2f=φid2
    这里的 id2 很烦,考虑把它消去,只需卷积一个 id2 即可。
    证明:(φid2)id2=dnφ(d)d2(nd)2=n2dnφ(d)=n3=id3,证毕。
    推广一下:(φidk)idk=idk+1,直接用即可。

所以 fid2=id3,设 S(n)=i=1nf(i)

则运用杜教筛公式得:

S(n)=i=1ni3i=2ni2S(ni)=(n(n+1)2)2i=2ni2S(ni)

整除分块即可,注意取模求逆元。

代码

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