拉格朗日反演
小记一下拉格朗日反演是个什么东西。如果您知道这是个什么东西那可以走了。
复合和复合逆
定义两个幂级数的复合为:
就是把 \(x\) 换成里边的函数。
定义幂级数的复合逆:若幂级数 \(F(x),G(x)\) 满足 \(F(G(x))=x\),则它们互为复合逆。容易发现 \(G(F(x))=x\)。
当然我们通常不关心这俩玩意怎么算。
形式洛朗级数
定义数列 \({a_n}_{n\ge n_0}\) 的形式洛朗级数为:
容易得到它的幂
有引理(形式留数):对于幂级数 \(F(x)\) 满足 \(n_0=1\),那么对于 \(\forall k\in \mathbb{Z}\),有:
证明:分情况。
- \(k\neq -1\):有 \(F'(x)F^k(x)=\left(\dfrac 1{k+1}F^{k+1}(x)\right)'\),而 \((x^0)'=0x^{-1}\),因此 \(-1\) 次项为 \(0\)。
- \(k=-q\):套一下。
容易发现 \(-1\) 次项系数为 \(1\)。
拉格朗日反演
对于幂级数 \(F(x)\) 满足 \(n_0=1\) 与其复合逆 \(G(x)\),那么对于 \(n,k\in \mathbb{Z}\),有
非常对称。非常优美。证一下。
使用上边提到的形式留数定义:
事实上我们还有扩展拉格朗日反演
一个例题。
P7592 数树(2021 CoE-II E)
很难想象为什么这个东西是紫的。
首先这玩意显然是个假期望。看见一大堆东西不知道该说什么。但是仍然尝试构造二元生成函数
其中 \(f_{i,j}\) 是 \(i\) 个节点权值为 \(j\) 的树的个数。根据题意小列个方程:
长得就很拉格朗日反演。那么得到复合逆
套拉格朗日反演:
分别看分子分母。
分母:显然就是 \(F(x,1)\)。那代进去:(我发现我二项式定理也开始不写组合数了)
那枚举一个 \(i\),\(j\) 是固定的,可以线性。
分子:算上权值就是对 \(y\) 求偏导。那么答案就是
自己拆去。(逐渐暴躁)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int mod=998244353;
int k1,k2,n,a,b;
int jc[10000010],inv[10000010];
int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=1ll*ans*a%mod;
a=1ll*a*a%mod;
b>>=1;
}
return ans;
}
int C(int n,int m){
return 1ll*jc[n]*inv[m]%mod*inv[n-m]%mod;
}
int main(){
scanf("%d%d%d%d%d",&k1,&k2,&n,&a,&b);jc[0]=inv[0]=1;
for(int i=1;i<=n;i++)jc[i]=1ll*jc[i-1]*i%mod;
inv[n]=qpow(jc[n],mod-2);
for(int i=n-1;i>=1;i--)inv[i]=1ll*inv[i+1]*(i+1)%mod;
int down=0;
for(int i=0;i*k1<=n-1;i++){
if((n-1-i*k1)%k2==0)down=(down+1ll*C(n,i)*C(n-i,(n-1-i*k1)/k2))%mod;
}
down=1ll*down*qpow(n,mod-2)%mod;
int ret=0,up=0;
for(int i=0;i*k1<=n-1-k1;i++){
if((n-1-(i+1)*k1)%k2==0)ret=(ret+1ll*C(n-1,i)*C(n-1-i,(n-1-(i+1)*k1)/k2))%mod;
}
up=(up+1ll*ret*a)%mod;ret=0;
for(int i=0;i*k1<=n-1-k2;i++){
if((n-1-k2-i*k1)%k2==0)ret=(ret+1ll*C(n-1,i)*C(n-1-i,(n-1-k2-i*k1)/k2))%mod;
}
up=(up+1ll*ret*b)%mod;
up=1ll*up*qpow(down,mod-2)%mod;
printf("%d\n",up);
return 0;
}
另类拉格朗日反演
对于 \(n=0,k<0\) 等情况,拉格朗日反演并不一定起作用。EI 提出另类拉格朗日反演:在和上面同样的条件下:
证明:
同样套用形式留数即可得到结论:
另类拉格朗日反演同样有复合形式:
应用:小孩召开法。写过题解。
事实上有所谓“多元拉格朗日反演”,然而目前出现的题都可以使用更加初等的解法解决,因此在此不表。