二项式反演的推法是什么?
f(n)=∑k=0n(kn)g(k)
g(n)=∑k=0n(kn)(−1)n−kf(k)
我们说句废话
g(n)=∑k=0n(kn)[n−k==0]g(i)
然后对于上式中[n-k==0],进行二项式展开
即利用[n==0]=∑i=0n(−1)i(in)
就有了
循环节长度为n的字符串个数,n<=1e9
莫比乌斯反演
f(n)=26n,长度为n随便字符串
g(n)=∑d∣nμ(dn)f(d)
g(n)就是答案
根据这个以及我们观察可知:
对于形式f(n)=∑k,nan,k∗g(k)
可以有一套定式的
g(k)=∑k,nμ(n,k)f(n)
来反演内层函数g
其中我们一定有∑k=1nan,kμ(k,m)=[n==m]
这个魔术等于没变,因为这个μ显然不好求qwq
于是我们想写成矩阵的形式,你会发现这个等价于求下三角矩阵的逆矩阵
下三角矩阵求逆是O(n2)的,因为只需要高斯消元的时候上界枚举到对角线下界枚举到i就好了
因为显然根据一开始写成的式子,无论是二项式反演还是莫反都只是一个f的一列数*矩阵=g的一列数
那不妨我们放一只例题
j=1∑ngcd(i,j)c∗lcm(i,j)dxj≡bi(modp)
n<=1e3?
n<=1e5?
前者显然可以构建矩阵,然后mod意义下矩阵求逆
后者?老老实实反演吧
i=1∑ngcd(i,j)c−didjdxj≡bi
我们可以推出
t∣i∑dcj=1∑⌊tn⌋pt∣i,p∣j∑μ(p)idjdxjd=bi
考虑交换位置,我们把i^d这个东西除过去
T∣i∑t∣T∑tcμ(T/t)j=1∑TnjdxjT≡bi/g(i)
g(i)=id
坏了,我们现在已知到右边,想求左边,这怎么办?
反演啊
我们显然可以写成
T∣i∑f(T)z(T)=bi/g(i)
我们已经知道右边,想求左边,莫反他有
f(T)z(T)=∑q∣Tbq/g(q)
然后我们有了f(T)z(T)
显然的是,这个f怎么都能O(npoly(log))预处理
然后我们有这个z了
z(T)=∑j=1Tn(j)dxjT
坏坏了,我们现在已知到右边,想求左边,这怎么办?
魔术啊
我们把第一项单独拿出来
h(d)xd=zd−∑j=1n[j>d][d∣j]hj∗xj
你会发现第一项有了,后面那个东西啊显然可以从后向前O(nlogn)求出来,因为d的倍数是调和级数呢
所以就做完了
总而言之,反演就完了
当然,你会发现第二歩很通式,我们尝试用它解下第一步
∑T∣if(T)z(T)=bi/g(i)
分裂
f(i)z(i)=bi/g(i)−∑T∣i,T>if(T)z(T)
同样使用调和级数,即
for (int i = 1; i <= n; i++)
f_z[i] = b[i] / g(i);
for (int i = 1; i <= n; i++)
for (int j = i + i; j <= n; j += i)
f_z[j] -= f_z[i];
子集反演(就是裸容斥)
f(S)=∑T∈Sg(T)
g(S)∑T∈S(−1)∣S∣−∣T∣f(T)
eg:
A,B数组长度为2n−1
Ci=∑j∣k=iAjBk
问C,n<=20
:"考虑FWT"
考虑你不会FWT
我们要转换条件
恰好或起来为i,等价于或起来至多为i,然后容斥qwq
定义a′=∑p∈Sap注意到c′=a′∗b′
因为[p∪q∈S]=[p∈S][q∈S]
怎么求c?
暴力枚举
逆高维前缀和即可
高维前缀和是把每一维向前推的过程
逆高维前缀和就是把每一维差分回来的过程
就是把+变成-
为什么对?
等价于子集反演
如果用莫反,我们甚至可以实现r=gcd(p,q),lcm之类的
多重子集反演
允许多个元素出现组成集合
f(S)=∑T∈Sg(T)
定义μ(S)是S中包容重复元素时为0,否则为∣−1∣∣S∣
∑T∈Sμ(T)=[S=0]
g(S)=∑T∈Sμ(S−T)f(T)
FFT
的模板题如何反演的视角解释?
定义zhq为单位根
∑k=0n−1zhqvk=1−zhqvk1−zhqnvk=0
等于0是显然的
如果有ljh的数学知识,你就会意识到当公比为1的时候要特判!
n1∑k=0n−1zhqvk=[vmodn==0]
利用上式变魔术
[(p+q−r)modn=0]=n1∑k=0n−1zhq−rkzhqpkzhqqk
cr=n1∑k=0n−1zhq−rk∑p,qzhqpkapzhqqkbq
cr=n1∑k=0n−1zhq−rk∑pzhqpkap∑qzhqqkbq
哼,反演
fm=∑k=0m−1zhqmkgk
gm=n1∑k=0n−1zhq−mkfk
多项式乘法就相当于算出一式这个f的乘积,然后根据二式再反演出g就是c数组
and卷积?n<=20
[p and q=r]=[!p ∣ !q∈ !r]
其实挺蠢的
子 集 卷 积
cr=∑p∈rapbr xor p
n<=18
数据范围有了些许不同
等价于[pandq=0][p∣q=r]
等价于[!p∣!q∈2n−1][p∣q=r]
你又废了,我也不知道可不可行
我们多定义一维i,表示|S|=i的集合的卷积
∑p∈r[∣p∣=i]apbrxorp
注意我们对于或要枚举r的一个子集v,然后满足
cr,i=∑v∈r(−1)∣r∣−∣v∣∑p,q∈v[∣p∣=i][∣q∣=∣r∣−i]apbq
这个式子还不简单?处理ap,i′=∑s∈p[∣S∣=i]as
n22n
逆,高维前缀和秒一切
GG!
其实我们就是重糊了FWT和FFT,而且子集卷积更菜
感觉学到不多?不可能💢