拉格朗日反演学习记录

updating … … \texttt{updating……} updating……

多项式复合

对于多项式 F ( x ) , G ( x ) F(x),G(x) F(x),G(x),其复合为:

F ( G ( x ) ) = ∑ i [ x i ] F ( x ) G ( x ) i F(G(x))=\sum_{i}[x^i]F(x)G(x)^i F(G(x))=i[xi]F(x)G(x)i

求法:

B = n B=\sqrt n B=n

∑ i = 0 n [ x i ] F ( x ) G ( x ) i = ∑ i = 0 B − 1 ∑ j = 0 B − 1 [ x i B + j ] F ( x ) G ( x ) i B + j = ∑ i = 0 B − 1 G ( x ) i B ∑ j = 0 B − 1 [ x i B + j ] F ( x ) G ( x ) j \begin{aligned} \sum_{i=0}^n[x^i]F(x)G(x)^i &=\sum_{i=0}^{B-1}\sum_{j=0}^{B-1}[x^{iB+j}]F(x)G(x)^{iB+j}\\ &=\sum_{i=0}^{B-1}G(x)^{iB}\sum_{j=0}^{B-1}[x^{iB+j}]F(x)G(x)^j\\ \end{aligned} i=0n[xi]F(x)G(x)i=i=0B1j=0B1[xiB+j]F(x)G(x)iB+j=i=0B1G(x)iBj=0B1[xiB+j]F(x)G(x)j

对于 i ∈ [ 0 , B − 1 ] i\in [0,B-1] i[0,B1],预处理 G ( x ) i G(x)^i G(x)i,复杂度 O ( n n log ⁡ n ) O(n\sqrt n\log n) O(nn logn)

∑ j = 0 B − 1 [ x i B + j ] F ( x ) G ( x ) j \sum_{j=0}^{B-1}[x^{iB+j}]F(x)G(x)^j j=0B1[xiB+j]F(x)G(x)j可以 O ( n 2 ) O(n^2) O(n2)算,然后乘上前面的 G ( x ) i B G(x)^{iB} G(x)iB就行了.

总复杂度 O ( n 2 + n n log ⁡ n ) O(n^2+n\sqrt n\log n) O(n2+nn logn)

P5373 【模板】多项式复合函数

多项式复合逆

对于多项式 F ( x ) F(x) F(x),存在另一多项式 G ( x ) G(x) G(x)使得 G ( F ( x ) ) = x G(F(x))=x G(F(x))=x,则称 G G G F F F复合逆

可证明此时 F ( G ( x ) ) = x F(G(x))=x F(G(x))=x,即 F F F G G G互为复合逆。

拉格朗日反演

前提是0次项为0,1次项有逆。

对于函数 F ( x ) F(x) F(x)及其复合逆 G ( x ) G(x) G(x)有:

[ x n ] G ( x ) = 1 n [ x n − 1 ] ( x F ( x ) ) n [x^n]G(x)=\frac{1}{n}[x^{n-1}](\frac{x}{F(x)})^n [xn]G(x)=n1[xn1](F(x)x)n

证明略。

拉格朗日反演的应用

  • 1. \texttt{1.} 1.多项式复合逆的求解

拉格朗日反演公式得:

F ( x ) F(x) F(x)的复合逆 G ( x ) = ∑ i = 1 n 1 i [ x i − 1 ] ( x F ( x ) ) i x i G(x)=\sum_{i=1}^n\frac{1}{i}[x^{i-1}](\frac{x}{F(x)})^ix^i G(x)=i=1ni1[xi1](F(x)x)ixi

= ∑ i = 1 n 1 i [ x i − 1 ] ( x F ( x ) ) B ⌊ i B ⌋ ( x F ( x ) ) i % B x i =\sum_{i=1}^n\frac{1}{i}[x^{i-1}](\frac{x}{F(x)})^{B\lfloor \frac{i}{B}\rfloor}(\frac{x}{F(x)})^{i\% B}x^i =i=1ni1[xi1](F(x)x)BBi(F(x)x)i%Bxi

预处理 ( x F ( x ) ) i B (\frac{x}{F(x)})^{iB} (F(x)x)iB以及 ( x F ( x ) ) i , i ∈ [ 0 , B − 1 ] (\frac{x}{F(x)})^{i},i\in[0,B-1] (F(x)x)i,i[0,B1]

然后再合并就行了。

复杂度 O ( n 2 + n n log ⁡ n ) O(n^2+n\sqrt n\log n) O(n2+nn logn)

P5809 【模板】多项式复合逆

  • 2. \texttt{2.} 2.P7592 数树(2021 CoE-II E)

简要题意

称一棵有根树 T T T k 1 − k 2 k1-k2 k1k2树,当且仅当其所有非叶节点满足子节点个数要么为 k 1 k1 k1要么为 k 2 k2 k2

称一棵 k 1 − k 2 k1-k2 k1k2树的权值是 a × k 1 a\times k1 a×k1的个数+ b × k 2 b\times k2 b×k2的个数。

节点无标号,但子树之间有顺序。

求随机生成的一棵树的期望权值。

解题思路

F ( x , y ) F(x,y) F(x,y), x x x代表点数, y y y代表 k 1 k1 k1点数的二元生成函数。

枚举根节点是k1/k2/叶子,有:

F = x ( y F k 1 + F k 2 + 1 ) F=x(yF^{k1}+F^{k2}+1) F=x(yFk1+Fk2+1)

F y F k 1 + F k 2 + 1 = x \frac{F}{yF^{k1}+F^{k2}+1}=x yFk1+Fk2+1F=x

G ( x , y ) = x y x k 1 + x k 2 + 1 G(x,y)=\frac{x}{yx^{k1}+x^{k2}+1} G(x,y)=yxk1+xk2+1x

G G G F F F互为复合逆。

由拉格朗日反演公式得:

[ x n ] F = 1 n [ x n − 1 ] ( y x k 1 + x k 2 + 1 ) n [x^n]F=\frac{1}{n}[x^{n-1}](yx^{k1}+x^{k2}+1)^n [xn]F=n1[xn1](yxk1+xk2+1)n

$$
\begin{aligned}

x{n-1}ym^n
&=[x{n-1}ym]\sum_{i=0}nC_ni(yx{k1}+x{k2})^i\
&=[x{n-1}ym]\sum_{i=0}n\sum_{j=0}iC_niC_ij yjx{k1j+k2(i-j)}\
&=[x{n-1}]\sum_{i=0}nC_niC_imx^{k1m+k2(i-m)}\
&=\sum_{i=0}nC_niC_i^m[k1m+k2(i-m)=n-1]\
\end{aligned}
$$

i i i取值唯一,可以直接计算。

算出之后期望就很简单了。

复杂度 O ( n ) O(n) O(n)

#include
using namespace std;
const int mod = 998244353;
int Pow(int a,int b)
{
	int res=1;
	while(b)
	{
		if(b&1)res=1ll*res*a%mod;
		a=1ll*a*a%mod;
		b>>=1;
	}
	return res;
}
const int N = 1e7+7;
int fac[N],ifac[N];
void Init(int n)
{
	fac[0]=1;
	for(int i=1;i<=n;i++)
	fac[i]=1ll*fac[i-1]*i%mod;
	ifac[n]=Pow(fac[n],mod-2);
	for(int i=n-1;i>=0;i--)
	ifac[i]=1ll*ifac[i+1]*(i+1)%mod; 
}
int C(int n,int m)
{
	if(n<0||m<0||n<m)return 0;
	return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod; 
}
int main()
{
	Init(N-1);
	int k1,k2,n,a,b;
	cin>>k1>>k2>>n>>a>>b;
	int P=0,Q=0;
	int I=Pow(n,mod-2);
	for(int i=0;i*k1<=n-1;i++)
	{
		if((n-1-i*k1)%k2!=0)continue;
		int j=(n-1-i*k1)/k2;
		int S=1ll*C(n,i+j)*C(i+j,i)%mod;
		S=1ll*S*I%mod;
		Q=(Q+S)%mod;
		int W=(1ll*a*i%mod+1ll*b*j%mod)%mod;
		P=(P+1ll*S*W%mod)%mod;
	}
	Q=Pow(Q,mod-2);
	cout<<1ll*P*Q%mod;
	return 0;
}

你可能感兴趣的:(数学相关——组合数学,数学——多项式,学习,算法)