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=0∑n[xi]F(x)G(x)i=i=0∑B−1j=0∑B−1[xiB+j]F(x)G(x)iB+j=i=0∑B−1G(x)iBj=0∑B−1[xiB+j]F(x)G(x)j
对于 i ∈ [ 0 , B − 1 ] i\in [0,B-1] i∈[0,B−1],预处理 G ( x ) i G(x)^i G(x)i,复杂度 O ( n n log n ) O(n\sqrt n\log n) O(nnlogn)
∑ 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=0B−1[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+nnlogn)
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[xn−1](F(x)x)n
证明略。
拉格朗日反演公式得:
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[xi−1](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=1∑ni1[xi−1](F(x)x)B⌊Bi⌋(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,B−1]
然后再合并就行了。
复杂度 O ( n 2 + n n log n ) O(n^2+n\sqrt n\log n) O(n2+nnlogn)
P5809 【模板】多项式复合逆
称一棵有根树 T T T是 k 1 − k 2 k1-k2 k1−k2树,当且仅当其所有非叶节点满足子节点个数要么为 k 1 k1 k1要么为 k 2 k2 k2。
称一棵 k 1 − k 2 k1-k2 k1−k2树的权值是 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[xn−1](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;
}