浅(抄)谈(袭)一类反演问题

这是一个数学完全从0开始异世界生活的人的反演笔记。
我们发现自己不会二项式定理,故无法学习二项式反演,所以我们要先学习一个:


引入:

二项式定理:

k=0n(nk)akbnk=(a+b)n

怎么证明呢?
实际上就是让我们证明右边的那个展开式的系数嘛。
实际上,展开的话就是在 n a+b里选了 k a, nk b ,这样的话显然有组合数的取模方案。
我们由二项式定理可以引出一个重要的结论:
k=0n(nk)(1)k1nk=(11)n=0?

让我们冷静一下之后,重新得到了这个结论:
随便叫一个名字吧……
二项式定理0定理,简称二十定理?(大雾
k=0n(1)k(nk)=[n=0]


正题


二项式反演:
基本条件:

f(n)=k=0n(nk)g(k)

我们对 g 进行恒等变形:
g(n)=k=0n[n=k](nk)g(k)

[n=k] 这个式子等价于 [nk=0] ,那么运用20定理(2333333):
g(n)=k=0nj=0nk(1)j(nkj)(nk)g(k)

注意到, k j都是 n 的子集,我们选k j 的顺序是不变的!
(如果不能理解的话请看下面部分)


把这个叫做组合数变形1吧:

(nk)(nkj)=(nk)(njk)

理性证明:
(nk)(nkj)=n!k!(nkj)!j!

(nk)(njk)=n!k!(nkj)!j!

证明完毕!


既然我们选 k j的顺序是不变的,我们可以进行替换:

g(n)=k=0nj=0nk(1)j(njk)(nj)g(k)

我们对求和符号进行交换。
g(n)=j=0n(1)j(nj)k=0nj(njk)g(k)

注意到初始条件:
f(n)=k=0n(nk)g(k)

那么我们就得到了 二项式反演
g(n)=j=0n(1)j(nj)f(nj)

下标好难受啊。
我们换一下变量名和下标吧。
g(n)=k=0n(1)nk(nk)f(k)


死理性派:
我觉得这个求和符号交换的不对!

k=0nm=0nkf(m,k)[1]

m=0nk=0nmf(m,k)[2]

k=k0 时,显然有:
ans1=m=0nk0f(m,k0)[1]

ans2=m=0n[k0<=nm]f(m,k0)[2]

呃……
好好好,相等总可以了吧。


这样我们不仅得到了反演:

g(n)=k=0n(1)nk(nk)f(k)
而且得到了一个重要的求和符号交换法则:
k=0nm=0nk<=>m=0nk=0nm

看起来没什么的。
推广一下,实际上:
k=k0nm=m0nk<=>m=m0nk=k0nm

求和符号交换法则 [1] 诞生啦!

完整的二项式反演定理书写:
若已知:

f(n)=k=0n(nk)g(n)

则:
g(n)=k=0n(1)nk(nk)f(k)

反演是可逆的。


我们上面写了二项式反演,用的自然是二项式定理(其实就是容斥原理嘛)。接下来可以学习更高端的东西啦!


莫比乌斯反演:
定义:一种函数叫做莫比乌斯函数。
它是满足这样性质的函数:

d|nμ(d)=[n=1]

莫比乌斯反演的前提条件是有两个数论函数 f g,其中:
f(n)=d|ng(d)

让我们重新回忆一下二项式反演的时候我们做了啥:
1.找出一个恒等变换。
2.把[P]这个条件P代入。
同样地:
g(n)=d|n[d=n]g(d)

g(n)=d|n[nd=1]g(d)

带入:
g(n)=d|nd|ndμ(d)g(d)

g(n)=d|nd|ndμ(d)g(d)

交换求和符号:
g(n)=d|nμ(d)d|ndg(d)

我们有一个初始条件:
f(n)=d|ng(d)

照着写:
g(n)=d|nμ(d)f(nd)

变漂亮一点?
g(n)=d|nμ(nd)f(d)

这就是我们的 莫比乌斯反演
整理一下:
已知:
f(n)=d|ng(d)

可得:
g(n)=d|nμ(nd)f(d)


死理性派:
为什么交换求和符号是对的?

d|nd|ndf(d,d)<=>d|nd|ndf(d,d)

(d=d0)|n ,我们只需要证明在任意 d0 处相等。
在前面的式子中:
d|nd0f(d0,d)

在后面的式子中:
d|n[d0|nd]f(d0,d)

显然是相等的对吧。


终于解释清楚了莫比乌斯反演。
不过莫比乌斯反演还有第二种形式,我们到时候再说。

f(n)=n|dg(d)


g(n)=n|dμ(dn)f(d)

终于证明出来了……累得要死TAT
g(n)=n|d[dn=1]g(d)

g(n)=n|dd|dnμ(d)g(d)

k=dn
g(n)=n|dd|kμ(d)g(d)

枚举k。
g(n)=k=1+ood|kμ(d)g(nk)

垃圾反演,不证了


子集反演


预备知识:

ps(1)|p|=[s=]

理由?
显然大小为 |p| 的集合出现了 (|s||p|) 次。
|p|=0|s|(1)|p|=[|s|=0]

这个应该没有忘记吧。
20定理2333333
把它叫做非空集合恒等式吧。


我们如果要解决这样一类问题?

cr=p,q[p or q=r]apbq

我们求 c 要怎么求呢?
首先直接求肯定不好求对吧。
我们把它变成子集的形式。<称为子集变换>
ar=prap

子集变换怎么求呢?

for(int i = 0;i < n;++ i)
    for(int s = 0;s < (1 << n);++ s)
        if(s & (1 << i))f[s] += f[s ^ (1 << i)];

之后,f就变为了子集变换。
那么我们去求 cr 吧。
毫无疑问, cr=prcp .
但这样肯定还不够,我们要求 c ,所以我们要另找一个东西和cr相等。
先考虑计算 ar
我们设 a[i][S] 表示在插入第 i 个元素时,终止集合形态为S的子集变换。

if(iS)a[i][S]=a[i1][S]+a[i1][Si];

else a[i][S]=a[i1][S];

这样我们可以在 O(n2n) 的时间复杂度进行子集变换。
(听说叫莫比乌斯变换,不过无所谓了吧233)
cr=p,q[porqr]apbq

cr=p[pr]apq[qr]bq

已知:
ar=prap

cr=arbr

还没完呢,我们要求出 cr .
根据非空集合恒等式:
cr=pr[rp=0]cp

cr=prqrp(1)|q|cp

cr=qrprp(1)|q|cp

cr=qr(1)|q|prpcp

初始条件:
ar=prap

cr=qr(1)|q|crq

变换下标及不好看的变量:
初始条件:
f(s)=psg(p)

推出:
g(s)=ps(1)|s||p|f(p)


死理性派:没错我又是来问和号为什么能交换的……诶你别打我啊……

psqspf(p,q)

qspsqf(p,q)

要证明这两个相等,设其中一个在 q0 处(默认它是 s 的子集)。
ps[q0sp]f(p,q0)

psq0f(p,q0)

显然相等对吧。


至此似乎反演内容已经要接近尾声了。
然而实际上似乎还有很多事情没有学会。
不管了,本篇blog先到这里吧,确实太累了。
这个真的很认真的有在写……
感觉终于不是硬生生抄了一遍证明而是真正意义上的写出来了2333


补充容斥原理:
形式上是:

i=1nai=CS(1)|C|1eCe

这是显然的,因为我们对其中某个满足在 k 个集合里的元素x,很容易用二项式定理得出容斥原理。
对于 >k 显然无意义。
对于小于 k ,每次结算的次数是(k|C|)
二项式定理大家都会,就不说了hh。
对于超集显然也成立。
实际上,并集也可以转成交集。
AB=A¯¯¯B¯¯¯
另外如果我们定义一种变换 ϕ
ϕf(s)=tsf(t)

则显然有其逆变换:
ϕ1f(s)=ts(1)|t||s|f(t)

<带入一下证明就好了。>
那么我们就可以把”恰好”转化成”至少”:
f(s) 表示恰好集合为 s 的元素个数,g(s)表示至少满足结合 s 的元素个数。我们显然有:
f(s)=ts(1)|ts|g(t)

如果我们在集合的 大小相同的情况下,两个集合是等价的。
那么我们就可以令 bn=i=0

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值