多项式运算

article/2025/9/18 5:44:10

多项式求逆

已知 f ( x ) f(x) f(x),求 g ( x ) g(x) g(x)满足 f ( x ) g ( x ) ≡ 1 ( m o d x n ) f(x)g(x)\equiv 1\pmod{x^n} f(x)g(x)1(modxn)
f 0 = 0 f_0=0 f0=0,那么显然不可能存在形式幂级数 g ( x ) g(x) g(x)满足条件。于是假定 f 0 ≠ 0 f_0\neq 0 f0=0

首先有 f ( x ) ≡ f 0 ( m o d x ) f(x)\equiv f_0\pmod {x} f(x)f0(modx),所以 g ( x ) ≡ f 0 − 1 ( m o d x ) g(x)\equiv f_0^{-1} \pmod {x} g(x)f01(modx)
假设已经求出了 f ( x ) g ′ ( x ) ≡ 1 ( m o d x n 2 ) f(x)g'(x)\equiv 1\pmod {x^\frac n2} f(x)g(x)1(modx2n)
那么 f ( x ) g ′ ( x ) − 1 ≡ 0 ( m o d x n 2 ) f(x)g'(x)-1\equiv0\pmod {x^\frac n2} f(x)g(x)10(modx2n)
两边平方使得模的次数翻倍(证明略): f 2 ( x ) g ′ 2 ( x ) − 2 f ( x ) g ′ ( x ) + 1 ≡ 0 ( m o d x n ) f^2(x)g'^2(x)-2f(x)g'(x)+1\equiv 0\pmod {x^n} f2(x)g2(x)2f(x)g(x)+10(modxn)
那么 f ( x ) ( 2 g ′ ( x ) − f ( x ) g ′ 2 ( x ) ) ≡ 1 ( m o d x n ) f(x)\left(2g'(x)-f(x)g'^2(x)\right)\equiv 1\pmod {x^n} f(x)(2g(x)f(x)g2(x))1(modxn)
容易发现括号中的式子就是要求的 g ( x ) g(x) g(x),即 g ( x ) = 2 g ′ ( x ) − f ( x ) g ′ 2 ( x ) ( m o d x n ) g(x)=2g'(x)-f(x)g'^2(x) \pmod {x^n} g(x)=2g(x)f(x)g2(x)(modxn)


前置知识:多项式牛顿迭代

用于寻找多项式零点,已知多项式 G G G,求满足 G ( F ( x ) ) ≡ 0 ( m o d x n ) G(F(x))\equiv0\pmod {x^n} G(F(x))0(modxn) F ( x ) F(x) F(x)
假设已经求出了 G ( F 0 ( x ) ) ≡ 0 ( m o d x n 2 ) G(F_0(x))\equiv0\pmod {x^{\frac n2}} G(F0(x))0(modx2n)
G ( F ( x ) ) G(F(x)) G(F(x)) F 0 ( x ) F_0(x) F0(x)处泰勒展开:
G ( F ( x ) ) = ∑ n = 0 ∞ G ( n ) ( F 0 ( x ) ) n ! ( F ( x ) − F 0 ( x ) ) n G(F(x))=\sum_{n=0}^\infty{G^{(n)}(F_0(x))\over n!}(F(x)-F_0(x))^n G(F(x))=n=0n!G(n)(F0(x))(F(x)F0(x))n
因为 F ( x ) − F 0 ( x ) ≡ 0 ( m o d x n 2 ) F(x)-F_0(x)\equiv 0\pmod {x^{\frac n2}} F(x)F0(x)0(modx2n),所以展开式中在模 x n x^n xn意义下只需保留前两项:
G ( F ( x ) ) ≡ G ( F 0 ( x ) ) + G ′ ( F 0 ( x ) ) 1 ! ( F ( x ) − F 0 ( x ) ) ( m o d x n ) G(F(x))\equiv G(F_0(x))+{G'(F_0(x))\over 1!}(F(x)-F_0(x))\pmod {x^n} G(F(x))G(F0(x))+1!G(F0(x))(F(x)F0(x))(modxn)
G ( F ( x ) ) ≡ 0 ( m o d x n ) G(F(x))\equiv 0\pmod {x^n} G(F(x))0(modxn),代入后移项即得: F ( x ) = F 0 ( x ) − G ( F 0 ( x ) ) G ′ ( F 0 ( x ) ) ( m o d x n ) F(x)=F_0(x)-{G(F_0(x))\over G'(F_0(x))}\pmod {x^n} F(x)=F0(x)G(F0(x))G(F0(x))(modxn)

牛顿迭代多项式求逆

G ( x ) = 1 x − f ( z ) = 0 G(x)=\frac 1x-f(z)=0 G(x)=x1f(z)=0 就可以牛顿迭代了。 x x x 是多项式。

x 1 = x 0 − 1 x 0 − f ( z ) − 1 x 0 2 = x 0 ( 2 − x 0 f ( z ) ) x_1=x_0-\frac {\frac 1{x_0}-f(z)}{-\frac 1{x_0^2}}=x_0(2-x_0f(z)) x1=x0x021x01f(z)=x0(2x0f(z))


多项式开根

已知 f ( x ) f(x) f(x),求 g ( x ) g(x) g(x)满足 g ( x ) 2 = f ( x ) ( m o d x n ) g(x)^2=f(x)\pmod {x^n} g(x)2=f(x)(modxn)
G ( x ) = x 2 − f G(x)=x^2-f G(x)=x2f,牛顿迭代得到:

g 1 = g 0 − g 0 2 − f 2 g 0 = g 0 2 + f 2 g 0 g_1=g_0-{g_0^2-f\over 2g_0}={g_0\over2}+\frac f{2g_0} g1=g02g0g02f=2g0+2g0f

Code(CF438E The Child and Binary Tree,题解):

#include<bits/stdc++.h>
#define maxn 300005
#define rep(i,j,k) for(int i=(j),lim=(k);i<=lim;i++)
#define Clear(a,l,r) memset(a+(l),0,((r)-(l)+1)*(sizeof a[0]))
using namespace std;
const int mod = 998244353, inv2 = (mod+1)/2;
int w[maxn],WL,r[maxn];
int Pow(int a,int b){int s=1;for(;b;b>>=1,a=1ll*a*a%mod) b&1&&(s=1ll*s*a%mod); return s;}
void init(int n){w[0]=WL=1; while(WL<=n) WL<<=1; w[1]=Pow(3,(mod-1)/WL);for(int i=2;i<=WL;i++) w[i]=1ll*w[i-1]*w[1]%mod;
}
int upd(int x){return x+(x>>31&mod);}
void NTT(int *a,int len,int flg){for(int i=0;i<len;i++) if(i<(r[i]=r[i>>1]>>1|(i&1?len>>1:0))) swap(a[i],a[r[i]]);for(int i=2,l=1,v;i<=len;l=i,i<<=1) for(int j=0,t=WL/i;j<len;j+=i) for(int k=j,o=0;k<j+l;k++,o+=t)a[k+l]=upd(a[k]-(v=1ll*w[flg^1?WL-o:o]*a[k+l]%mod)),a[k]=upd(a[k]+v-mod);if(flg^1) for(int i=0,Inv=mod-(mod-1)/len;i<len;i++) a[i]=1ll*a[i]*Inv%mod;
}
void INV(int *A,int *B,int n){B[B[1]=0]=Pow(A[0],mod-2); static int C[maxn];for(int k=2,L=4;k<n<<1;k=L,L<<=1){rep(i,0,L-1) C[i]=i<k?A[i]:(B[i]=0);NTT(C,L,1),NTT(B,L,1); rep(i,0,L-1) B[i]=B[i]*(2-1ll*C[i]*B[i]%mod+mod)%mod;NTT(B,L,-1),Clear(B,min(n,k),L-1);}
}
void SQRT(int *A,int *B,int n){B[B[1]=0]=1; static int a[maxn],b[maxn];for(int k=2,L=4;k<n<<1;k=L,L<<=1){INV(B,b,k); rep(i,0,L-1) a[i]=i<k?A[i]:0;NTT(a,L,1),NTT(b,L,1); rep(i,0,L-1) b[i]=1ll*a[i]*b[i]%mod; NTT(b,L,-1);rep(i,0,min(k,n)-1) B[i]=1ll*(B[i]+b[i])*inv2%mod; Clear(B,min(n,k),L-1);}
}
int n,m,C[maxn],A[maxn],F[maxn];
int main()
{scanf("%d%d",&n,&m),init(2*m);for(int i=1,x;i<=n;i++) scanf("%d",&x),C[x]=mod-4;C[0]=1,SQRT(C,A,m+1),A[0]++,INV(A,F,m+1);for(int i=1;i<=m;i++) printf("%d\n",F[i]*2%mod);
}

多项式对数函数 ( ln ⁡ ) (\ln) (ln)

已知 f ( x ) f(x) f(x),求 g ( x ) = ln ⁡ f ( x ) ( m o d x n ) g(x)=\ln f(x)\pmod {x^n} g(x)=lnf(x)(modxn)

两边同时取导: g ′ ( x ) = f ′ ( x ) f ( x ) g'(x)={f'(x)\over f(x)} g(x)=f(x)f(x),再积分: g ( x ) = ∫ f ′ ( x ) f ( x ) g(x)=\int {f'(x)\over f(x)} g(x)=f(x)f(x)

注意,因为积分舍去了常数项,所以这里的积分在 g 0 = 0 g_0=0 g0=0 的情况下才是对的,即 f 0 f_0 f0 必须等于 1 1 1

l n x ln~x ln x 泰勒展开在模 x n x^n xn 意义下可以表示为 n − 1 n-1 n1 次多项式,而 l n C ln~C ln C 没法表示)

Code:

void LN(int *A,int *B,int n){INV(A,B,n); static int a[maxn]; int L=1<<(lg[n-2+n-1]+1);rep(i,0,L-1) a[i]=i<n-1?1ll*A[i+1]*(i+1)%mod:0,i>=n&&(B[i]=0);NTT(a,L,1),NTT(B,L,1); rep(i,0,L-1) a[i]=1ll*a[i]*B[i]%mod; NTT(a,L,-1);rep(i,0,L-1) B[i]=i&&i<n?1ll*a[i-1]*inv[i]%mod:0;
}

多项式指数函数 ( exp ⁡ ) (\exp) (exp)

已知 f ( x ) f(x) f(x),求 g ( x ) = e f ( x ) ( m o d x n ) g(x)=e^{f(x)}\pmod {x^n} g(x)=ef(x)(modxn)
ln ⁡ g ( x ) = f ( x ) \ln g(x)=f(x) lng(x)=f(x),设 G ( x ) = ln ⁡ x − f G(x)=\ln x-f G(x)=lnxf,牛顿迭代:
g 1 = g 0 − ln ⁡ g 0 − f 1 g 0 = g 0 ( 1 − ln ⁡ g 0 + f ) g_1=g_0-\frac {\ln g_0-f}{\frac 1{g_0}}=g_0(1-\ln g_0+f) g1=g0g01lng0f=g0(1lng0+f)
注意这里的 1 是常数而不是多项式。
需要保证 f 0 = 0 f_0=0 f0=0,才能保证 g ( x ) 0 = 1 g(x)_0=1 g(x)0=1,才可以求 ln ⁡ \ln ln

Code:

void EXP(int *A,int *B,int n){B[B[1]=0]=1; static int b[maxn];for(int k=2,L=4;k<n<<1;k=L,L<<=1){LN(B,b,k); rep(i,0,L-1) b[i]=i<k?upd((i==0)-b[i]+A[i]):(B[i]=0);NTT(B,L,1),NTT(b,L,1); rep(i,0,L-1) B[i]=1ll*B[i]*b[i]%mod; NTT(B,L,-1); Clear(B,min(n,k),L-1);}
}

分治FFT的做法 O ( n log ⁡ 2 n ) O(n\log^2n) O(nlog2n)(比如这个提交):
g ( x ) = e f ( x ) g ′ ( x ) = e f ( x ) f ′ ( x ) = g ( x ) f ′ ( x ) ( n + 1 ) g n + 1 = ∑ i = 0 n ( i + 1 ) f i + 1 g n − i n g n = ∑ i = 1 n i f i g n − i = ∑ i = 0 n − 1 g i ∗ ( n − i ) f n − i ( n > 0 ) g 0 = e f 0 g(x)=e^{f(x)}\\ g'(x)=e^{f(x)}f'(x)=g(x)f'(x)\\ (n+1)g_{n+1}=\sum_{i=0}^n(i+1)f_{i+1}g_{n-i}\\ ng_n=\sum_{i=1}^nif_ig_{n-i}=\sum_{i=0}^{n-1}g_i*(n-i)f_{n-i}~~~~(n>0)\\ g_0=e^{f_0} g(x)=ef(x)g(x)=ef(x)f(x)=g(x)f(x)(n+1)gn+1=i=0n(i+1)fi+1gningn=i=1nifigni=i=0n1gi(ni)fni    (n>0)g0=ef0

EGF 经典应用:连通图计数

所有图的 EGF 为 G ( x ) = ∑ i ≥ 0 g i i ! x i G(x)=\sum_{i\ge 0} \frac {g_i}{i!}x^i G(x)=i0i!gixi

连通图的 EGF 为 F ( x ) = ∑ i ≥ 1 f i i ! x i F(x)=\sum_{i\ge 1} \frac {f_i}{i!}x^i F(x)=i1i!fixi

那么有 G ( x ) = e F ( x ) = ∑ i ≥ 0 F ( x ) i i ! G(x)=e^{F(x)}=\sum_{i\ge 0}\frac {F(x)^i}{i!} G(x)=eF(x)=i0i!F(x)i

可以最后得到 g n g_n gn 需要乘上 n ! n! n! 。可以理解为枚举连通块个数,然后分配标号,连通块内部无序,每种有 k k k 个连通块的方案都被算了 k ! k! k! 次。


多项式快速幂

已知 f ( x ) f(x) f(x),求 g ( x ) = f ( x ) k ( m o d x n ) g(x)=f(x)^k\pmod {x^n} g(x)=f(x)k(modxn)

  • k ≤ 1 0 9 k\le10^9 k109
    倍增,为了避免循环卷积每次点值相乘后都要IDFT。 O ( n log ⁡ n log ⁡ k ) O(n\log n\log k) O(nlognlogk)

  • O ( δ ( f ) ∗ k ) O(\delta(f)*k) O(δ(f)k) δ ( f ) \delta(f) δ(f) 表示 f ( x ) f(x) f(x) 的最高次数
    同样倍增,但是只要FFT的长度大于等于 δ ( f ) ∗ k \delta(f)*k δ(f)k,就不需要每次IDFT了,直接对点值快速幂即可。

  • O ( δ ( f ) ∗ n ) O(\delta(f)*n) O(δ(f)n)
    求导可得 g ′ ( x ) = k f ( x ) k − 1 f ′ ( x ) ⟹ g ′ ( x ) f ( x ) = k f ′ ( x ) g ( x ) g'(x)=kf(x)^{k-1}f'(x)\Longrightarrow g'(x)f(x)=kf'(x)g(x) g(x)=kf(x)k1f(x)g(x)f(x)=kf(x)g(x)
    对第 t t t 项展开可得 ∑ i = 0 t ( t − i + 1 ) f i g t − i + 1 = ∑ i = 0 t k ( i + 1 ) f i + 1 g t − i \sum_{i=0}^t(t-i+1)f_ig_{t-i+1}=\sum_{i=0}^tk(i+1)f_{i+1}g_{t-i} i=0t(ti+1)figti+1=i=0tk(i+1)fi+1gti
    所以 g t + 1 ( t + 1 ) f 0 = ∑ i = 1 t k i f i g t − i + 1 − ( t − i + 1 ) f i g t − i + 1 = ∑ i = 1 t f i g t − i + 1 ( ( k + 1 ) i − t − 1 ) g_{t+1}(t+1)f_0=\sum_{i=1}^tkif_ig_{t-i+1}-(t-i+1)f_ig_{t-i+1}=\sum_{i=1}^tf_ig_{t-i+1}((k+1)i-t-1) gt+1(t+1)f0=i=1tkifigti+1(ti+1)figti+1=i=1tfigti+1((k+1)it1)
    于是可以 O ( δ ( f ) ) O(\delta (f)) O(δ(f)) 递推出答案的下一项。

  • k ≤ 1 0 1 0 5 k\le10^{10^5} k10105
    考虑 f ( x ) k = exp ⁡ ( k ln ⁡ f ( x ) ) f(x)^k=\exp(k\ln f(x)) f(x)k=exp(klnf(x))
    而在 m o d 998244353 \bmod~{998244353} mod 998244353 意义下 k ln ⁡ f ( x ) ≡ ( k m o d 998244353 ) ln ⁡ f ( x ) k\ln f(x)\equiv(k\bmod998244353)\ln f(x) klnf(x)(kmod998244353)lnf(x)
    所以可以在输入的时候就将 k m o d 998244353 k\bmod998244353 kmod998244353
    然后就可以使用第一种做法了。
    注意在模小质数意义下是不能这么解的,因为当 δ ( f ) > m o d \delta(f)>mod δ(f)>mod的时候 ln ⁡ f ( x ) \ln f(x) lnf(x) 可能没有意义

  • exp ⁡ 做 法 \exp做法 exp
    如果保证 f ( x ) [ x 0 ] = 1 f(x)[x^0]=1 f(x)[x0]=1,那么可以直接 ln ⁡ \ln ln k k k 然后 exp ⁡ \exp exp O ( n log ⁡ n ) O(n\log n) O(nlogn)
    常数项不为1没法求 ln ⁡ \ln ln,那就先除掉嘛, f ( x ) k = ( f ( x ) f 0 ) k ∗ f 0 k f(x)^k=\left(\frac {f(x)}{f_0}\right)^k*f_0^k f(x)k=(f0f(x))kf0k,然后括号里面就可以直接做了。
    但是 f 0 f_0 f0可能等于 0,于是找到最低次不为0的项 a t x t a_tx^t atxt,得到:
    f ( x ) k = ( f ( x ) a t x t ) k ∗ a t k x t k f(x)^k=\left(\frac {f(x)}{a_tx^t}\right)^k*a_t^kx^{tk} f(x)k=(atxtf(x))katkxtk括号里面的式子在 ( m o d x n − t k ) \pmod {x^{n-tk}} (modxntk) 意义下算就可以了。


多项式取模

暴力大除法 A ( x ) m o d B ( x ) A(x) \bmod B(x) A(x)modB(x) ,复杂度 O ( d e g ( B ) ∗ ( d e g ( A ) − d e g ( B ) ) ) O(deg(B)*(deg(A)-deg(B))) O(deg(B)(deg(A)deg(B)))

暴力求 g c d ( A ( x ) , B ( x ) ) gcd(A(x),B(x)) gcd(A(x),B(x)) 的首一多项式的复杂度是 O ( d e g ( A ) ∗ d e g ( B ) ) O(deg(A)*deg(B)) O(deg(A)deg(B)) 的。 T ( n , m ) = m ∗ ( n − m ) + O ( m 2 ) = O ( n m ) T(n,m)=m*(n-m)+O(m^2)=O(nm) T(n,m)=m(nm)+O(m2)=O(nm)

在这里插入图片描述


多项式多点求值

方法一:分治取模

在这里插入图片描述
基本思路1: F ( x i ) = F ( z ) m o d ( z − x i ) F(x_i)=F(z) \bmod (z-x_i) F(xi)=F(z)mod(zxi)

因为 z m o d ( z − x i ) = x i z \bmod (z-x_i)=x_i zmod(zxi)=xi,或令 F ( z ) = A ( z ) ( z − x i ) + B ( z ) F(z)=A(z)(z-x_i)+B(z) F(z)=A(z)(zxi)+B(z),带入 z = x i z=x_i z=xi

基本思路2: ( F ( z ) m o d A ( z ) B ( z ) ) m o d B ( z ) = F ( z ) m o d B ( z ) (F(z) \bmod A(z)B(z))\bmod B(z)=F(z)\bmod B(z) (F(z)modA(z)B(z))modB(z)=F(z)modB(z)

解法:

先令 F [ 1 , m ] = F ( z ) m o d ∏ 1 ≤ i ≤ m ( z − x i ) F_{[1,m]}=F(z)\bmod \prod_{1\le i\le m} (z-x_i) F[1,m]=F(z)mod1im(zxi),然后分治:

在这里插入图片描述

然而取模需要一次求逆,两次乘法,导致这个做法很慢。(没试过不知道,大家都说慢

类似的做法可以解决 ∏ 1 ≤ j < i ≤ n ( a i − a j ) \prod_{1\le j<i\le n}(a_i-a_j) 1j<in(aiaj)

F i ( z ) = ∏ 1 ≤ j < i ( z − a j ) F_i(z)=\prod_{1\le j<i}(z-a_j) Fi(z)=1j<i(zaj),那么答案为 ∏ F i ( a i ) = ∏ F i ( z ) m o d ( z − a i ) \prod F_i(a_i)=\prod F_i(z)\bmod (z-a_i) Fi(ai)=Fi(z)mod(zai)

分治 F [ l , r ] = ∏ 1 ≤ j < l ( z − a j ) m o d ∏ l ≤ i ≤ r ( z − a i ) F_{[l,r]}=\prod_{1\le j<l}(z-a_j)\bmod \prod_{l\le i\le r} (z-a_i) F[l,r]=1j<l(zaj)modlir(zai)

传进左边的时候模上 ∏ l ≤ i ≤ m i d ( z − a i ) \prod_{l\le i\le mid}(z-a_i) limid(zai)

传进右边的多项式是 F [ l , r ] ∗ ∏ l ≤ j ≤ m i d ( z − a j ) m o d ∏ m i d + 1 ≤ i ≤ r ( z − a i ) F_{[l,r]}*\prod_{l\le j\le mid}(z-a_j) \bmod \prod_{mid+1\le i\le r}(z-a_i) F[l,r]ljmid(zaj)modmid+1ir(zai)

传到叶子的时候显然就是 F i ( z ) m o d ( z − a i ) F_i(z)\bmod (z-a_i) Fi(z)mod(zai)

方法二:分治减法卷积

在这里插入图片描述
M U L T MULT MULT 即减法卷积(差为定值),第三行的性质是因为 i − ( j + k ) = i − j − k i-(j+k)=i-j-k i(j+k)=ijk

F [ l , r ] = M U L T ( F ( z ) , ∏ l ≤ i ≤ r 1 1 − x i z ) F_{[l,r]}=MULT(F(z),\prod_{l\le i\le r}\frac 1{1-x_iz}) F[l,r]=MULT(F(z),lir1xiz1)

那么 F [ l , m i d ] = M U L T ( F ( z ) , ∏ l ≤ i ≤ r 1 1 − x i z ∗ ∏ m i d + 1 ≤ i ≤ r ( 1 − x i z ) ) = M U L T ( F [ l , r ] , ∏ m i d + 1 ≤ i ≤ r ( 1 − x i z ) ) F_{[l,mid]}=MULT(F(z),\prod_{l\le i\le r}\frac 1{1-x_iz}*\prod _{mid+1\le i\le r}(1-x_iz))=MULT(F_{[l,r]},\prod_{mid+1\le i\le r}(1-x_iz)) F[l,mid]=MULT(F(z),lir1xiz1mid+1ir(1xiz))=MULT(F[l,r],mid+1ir(1xiz))

右边类似, F [ m i d + 1 , r ] = M U L T ( F [ l , r ] , ∏ l ≤ i ≤ m i d ( 1 − x i z ) ) F_{[mid+1,r]}=MULT(F_{[l,r]},\prod_{l\le i\le mid}(1-x_iz)) F[mid+1,r]=MULT(F[l,r],limid(1xiz))

每层最高项只需要保留到区间长度,因为大于区间长度的项最后对 [ z 0 ] [z^0] [z0] 没有贡献。

与方法一一样,先从下到上做一次分治FTT预处理,在根部做一次求逆和减法卷积,然后从上往下分治。每层只需要做减法卷积(一次乘法),比取模快很多。


多项式多点插值

在这里插入图片描述
相当于 F ( z ) = ∑ i = 0 n a i ∏ j ≠ i z − x j F(z)=\sum_{i=0}^na_i\prod_{j\neq i}z-x_j F(z)=i=0naij=izxj,从下到上分治,每次乘上左边或右边的 ∏ z − x j \prod z-x_j zxj 即可。

那么问题就是如何算 ∏ j ≠ i x i − x j \prod_{j\neq i}x_i-x_j j=ixixj

G ( z ) = ∏ i = 0 n ( z − x i ) G(z)=\prod_{i=0}^n(z-x_i) G(z)=i=0n(zxi),那么 G ( z ) ′ = ∑ i ∏ j ≠ i ( x − x j ) G(z)'=\sum_i\prod_{j\neq i}(x-x_j) G(z)=ij=i(xxj) G ( x i ) ′ = ∏ j ≠ i ( x − x j ) G(x_i)'=\prod_{j\neq i}(x-x_j) G(xi)=j=i(xxj)

分治求出 G ( z ) G(z) G(z),求导之后多点求值即可。 G ( z ) ′ G(z)' G(z) 这里可以用洛必达化成 ∏ x − x j x − x i \frac {\prod x-x_j}{x-x_i} xxixxj x = x i x=x_i x=xi 处的取值来理解,不过既不明所以又没有必要。


多项式复合

在这里插入图片描述


多项式复合逆

在这里插入图片描述

因为函数/多项式复合满足结合律。求的是 F F F 的左逆,假设 F ( H ( z ) ) = z F(H(z))=z F(H(z))=z,那么有:

G ( z ) = G ( F ( H ( z ) ) ) = ( G ∘ F ) ( H ( z ) ) = H ( z ) G(z)=G(F(H(z)))=(G\circ F)(H(z))=H(z) G(z)=G(F(H(z)))=(GF)(H(z))=H(z)

在这里插入图片描述


拉格朗日反演

为了与PPT统一(懒得改),以下 x x x 均表示关于 z z z 的多项式,即 x ( z ) x(z) x(z)
若 F ( z ) 与 x ( z ) 互 为 复 合 逆 , 即 F 和 x 的 常 数 项 为 0 , 1 次 项 非 0 , 且 F ( x ) = z , 则 : [ z n ] x = 1 n [ z − 1 ] ( 1 F ( z ) ) n 若 F(z) 与 x(z) 互为复合逆,即 F 和 x 的常数项为0,1次项非0,且F(x)=z,则:\\ [z^n]x=\frac 1n[z^{-1}](\frac 1{F(z)})^n F(z)x(z)Fx010F(x)=z[zn]x=n1[z1](F(z)1)n
z − 1 z^{-1} z1 是因为这里的多项式的域是分式环,即 A ( z ) B ( z ) \frac {A(z)}{B(z)} B(z)A(z),不需要考虑 B ( z ) B(z) B(z) 是否可逆,因为可以把它表示为 z d ∗ B ′ ( z ) z^d*B'(z) zdB(z),它的逆就是 z − d ∗ 1 B ′ ( z ) z^{-d}*\frac 1{B'(z)} zdB(z)1 ,所以任何多项式都可逆。

更实用的形式是 [ z n ] x = 1 n [ z n − 1 ] ( z F ( z ) ) n [z^n]x=\frac 1n[z^{n-1}](\frac z{F(z)})^n [zn]x=n1[zn1](F(z)z)n,因为 F ( z ) F(z) F(z) 常数项为 0,所以就可以在普通的形式幂级数下求逆和快速幂了。

扩展形式: [ z n ] H ( x ) = 1 n [ z − 1 ] H ′ ( z ) ( 1 F ( z ) ) n [z^n]H(x)=\frac 1n[z^{-1}]H'(z)(\frac 1{F(z)})^n [zn]H(x)=n1[z1]H(z)(F(z)1)n

于是求复合逆单项可以 O ( n log ⁡ n ) O(n\log n) O(nlogn)

证明

在这里插入图片描述

听完课后不到10min就看懂了网上那篇以前看起来是天书的拉格朗日反演blog…

myh赛高!

简单应用

在这里插入图片描述

特殊应用:二元生成函数

考虑二元生成函数 H ( u , z ) = 1 1 − u z H(u,z)=\frac 1{1-uz} H(u,z)=1uz1

那么由扩展拉格朗日反演有: [ z n ] H ( u , F ( z ) ) = 1 n [ z n − 1 ] H ( u , z ) ′ ( z F − 1 ( z ) ) n [z^n]H(u,F(z))=\frac 1n[z^{n-1}]H(u,z)'(\frac z{F^{-1}(z)})^n [zn]H(u,F(z))=n1[zn1]H(u,z)(F1(z)z)n,其中 F − 1 ( z ) F^{-1}(z) F1(z) F ( z ) F(z) F(z) 的复合逆。
[ z n ] 1 1 − u F ( z ) = 1 n [ z n − 1 ] ( 1 1 − u z ) ′ ( z F − 1 ( z ) ) n [z^n]\frac 1{1-uF(z)}=\frac 1n[z^{n-1}](\frac 1{1-uz})'(\frac z{F^{-1}(z)})^n [zn]1uF(z)1=n1[zn1](1uz1)(F1(z)z)n
d ( 1 1 − u z ) d z = ∑ i ≥ 0 u i + 1 ( i + 1 ) z i \frac {d(\frac 1{1-uz})}{dz}=\sum_{i\ge 0}u^{i+1}(i+1)z^i dzd(1uz1)=i0ui+1(i+1)zi

也就是说在求出 ( z F − 1 ( z ) ) n (\frac z{F^{-1}(z)})^n (F1(z)z)n 后,可以 O ( n ) O(n) O(n) 算出右边 i ∈ [ 0 , n ] , [ u i ] i\in[0,n],[u^i] i[0,n],[ui] 的值。

而左边等于 ∑ i ≥ 0 [ z n ] F ( z ) i u i \sum_{i\ge 0}[z^n]F(z)^iu^i i0[zn]F(z)iui,于是我们就得到了 i ∈ ( 0 , n ] , [ z n ] F ( z ) i i\in(0,n],[z^n]F(z)^i i(0,n],[zn]F(z)i 的值。

F ( z ) F(z) F(z) 没有复合逆时,有两种情况:

(1) [ z 0 ] F ( z ) = c [z^0]F(z)=c [z0]F(z)=c,则令 P ( z ) = F ( z ) − c P(z)=F(z)-c P(z)=F(z)c,求出 [ z n ] P ( z ) i [z^n]P(z)^i [zn]P(z)i 之后二项式定理展开 ( P ( z ) + c ) i (P(z)+c)^i (P(z)+c)i

做一次卷积即可。

(2) F ( z ) F(z) F(z) 的最低次项 k ≥ 2 k\ge 2 k2,则令 P ( z ) = F ( z ) 1 k P(z)=F(z)^{\frac 1k} P(z)=F(z)k1,那么 F ( z ) i = P ( z ) k i F(z)^i=P(z)^{ki} F(z)i=P(z)ki,而 [ z n ] F ( z ) i [z^n]F(z)^i [zn]F(z)i 只有当 i ≤ n k i\le \frac nk ikn 时有值。

二元生成函数 H ( u , z ) H(u,z) H(u,z) u u u 的指数 u i u^i ui 表示选了 i i i F F F 乘起来。 z z z 的指数在具体的题目中也可以体现不同的含义。

例题:ZJOI2020 抽卡


http://chatgpt.dhexx.cn/article/2IHYTOVc.shtml

相关文章

Beyond Accuracy:Behavioral Testing of NLP Models with Checklist 论文阅读

本文主要介绍以及翻译一篇ACL2020 Best Paper Beyond Accuracy:Behavioral Testing of NLP Models with Checklist Abstract 尽管传统评估模型好坏的方法是在测试集上观察accuracy指标&#xff0c;然而这个指标常常高估了NLP模型的真实表现&#xff0c;而另外一些评估模型的方法…

国密 SM4 高并发服务 加压测服务 加生成秘钥 结合上篇一起使用 国密 SM2 SM3 SM4 后续升级版本,内容丰富单独写一篇百万压测4000毫秒加解密

介绍 这篇是专门适用于高并发场景的加解密功能服务&#xff0c;提供了并发代码 &#xff0c;压测代码 以及压测报告结合上篇文章一起使用最好&#xff0c;先看上篇在看这篇&#xff0c;循序渐进&#xff0c;上篇主要看SM4 方面即可其他概要观看即可&#xff0c;有需要可以看看也…

创建dependencies.gradle文件报错

创建AS项目统一管理build.gradle但是报错 1.Only Project and Settings build scripts can contain plugins {} blocks 大概意思&#xff0c;是使用plugins目前还不能在自己创建的gradle文件中使用所以还是需要使用apply plugin 2.dependencies.gradle No signature of method…

JCE cannot authenticate the provider BC

我是用hutool做RSA加密时候出现这个问题的&#xff0c;具体原因网上各说各的&#xff0c;解决办法也试过下载jar、配置jvm&#xff0c;用是能用&#xff0c;但是我们是在公共包写的&#xff0c;部署新服务的时候就麻烦了。 看了下hutool报错的地方&#xff0c;顺着找了找&#…

JDK8安装JCE无限强度

原文&#xff1a;https://www.jianshu.com/p/de81059a9e97 https://blog.csdn.net/arctan90/article/details/68066660 报错提示&#xff1a; Exception in thread "main" org.jasypt.exceptions.EncryptionOperationNotPossibleException: 下载jar&#xff1a;h…

java jce配置_jce_policy安装【java密码扩展无限制权限策略文件安装】

下载与JDK或JRE对应版本的jce文件包&#xff0c;当前机器的jdk为1.8&#xff0c;所以下载jce_policy-8.zip。 下载解压后&#xff0c;把jar文件上传到需要安装jce机器上JDK或JRE的security目录下&#xff0c;覆盖源文件即可。 JDK&#xff1a;将两个jar文件放到%JDK_HOME%\jre\…

java jce配置_配置jce开发环境 | 学步园

虽然JDK1.4将java安全包包含在核心库中&#xff0c;但如果不对jce进行配置&#xff0c;也没办法使用jce进行开发。 首先从sun网上下载jce1.2.2(我在网上看到的都是下载一个包&#xff0c;没用sun默认的)&#xff0c;然后把解压得到的lib里面的所有jar文件拷到your_jdk\jre\lib\…

java jce-KeyGenerator(密钥生成)

java jce-KeyGenerator&#xff08;密钥生成&#xff09; 在开发时&#xff0c;总要涉及到数据的加密与解密&#xff0c;之前一直有些糊涂&#xff0c;最近看了 jce.jar的源码&#xff0c;来整理记录一下 接着上篇 java jce-Cipher&#xff08;加密、解密&#xff09; 来介绍…

java jce-Cipher(加密、解密)

java jce-Cipher&#xff08;加密、解密&#xff09; 在开发时&#xff0c;总要涉及到数据的加密与解密&#xff0c;之前一直有些糊涂&#xff0c;最近看了 jce.jar的源码&#xff0c;来整理记录一下 1、概念 JCA&#xff08;Java Cryptography Architecture&#xff09;: J…

什么是文件扩展名 JCE?

有没有人给您发送过 JCE文件&#xff0c;而您却不知道该如何打开&#xff1f;可能您在电脑上发现了一个 JCE文件却不知道这是做什么用的&#xff1f;Windows 可能会告诉您无法打开文件&#xff0c;或者最糟糕的是&#xff0c;您可能会收到一个JCE文件相关的错误信息。 打开JCE文…

JAVA加密--JCA、JCE、CSP概念、体系架构与使用示例

1 概念 JCA: Java密码体系结构 Java Cryptography Architecture JCE&#xff08;Java Cryptography Extension&#xff09;&#xff0c;在早期JDK版本中&#xff0c;由于受美国的密码出口条例约束&#xff0c;Java中涉及加解密功能的API被限制出口&#xff0c;所以Java中安全组…

JCE的功能分析

什么是JCE JCE&#xff08;Java Cryptography Extension&#xff09;即Java密码扩展&#xff0c;是JDK1.4的一个重要部分。它是一组包&#xff0c;它们提供用于加密、密钥生成算法和协商以及 Message Authentication Code&#xff08;MAC&#xff09;算法的框架和实现。 它提…

第四章 数据关联分析方法

基本概念和方法 关联规则和算法应用 基本概念和术语 关联规则算法应用&#xff1a; 一个关联规则分析的例子—————超市购物篮分析 不要看 后面数字看不懂 项集&#xff1a;是指项的集合。包含k个项的项集称为k-项集 支持度&#xff1a;若A是一个项集&#xff0c;则A的…

关联性——典型相关分析

1、作用 典型相关分析是研究多个变量和多个变量之间的线性相关关系&#xff0c;能够揭示出两组变量之间的内在联系。首先在每组变量中找到变量的线性组合&#xff0c;使得两组的线性组合之间具有最大的相关系数。然后选取和最初挑选的这对线性组合不相关的线性组合&#xff0c…

数据挖掘——关联分析基础介绍(上)

一、前提介绍&#xff1a; 啤酒与尿布&#xff1a; 在美国有婴儿的家庭中&#xff0c;一般是母亲在家中照看婴儿&#xff0c;年轻的父 亲前去超市购买尿布。父亲在购买尿布的同时&#xff0c;往往会顺便为自己购 买啤酒&#xff0c;这样就会出现啤酒与尿布这两件看上去不相干…

R语言做关联分析

目录 &#xff08;一&#xff09;案例简介 案例使用 数据预处理 分析结果 完整代码 目录 关联分析 理解关联分析的相关概念&#xff1a;关联分析、支持度、置信度、强规则、项集、频繁项集等。 掌握关联分析的基本方法&#xff1a;数据是事务的或关系的&#xff0c;如何由大量…

数据关联分析

数据挖掘算法&#xff1a;关联分析一&#xff08;基本概念&#xff09; 一.基本概念 我们来看上面的事务库&#xff0c;如同上表所示的二维数据集就是一个购物篮事务库。该事物库记录的是顾客购买商品的行为。这里的TID表示一次购买行为的编号&#xff0c;items表示顾客购买了…

关联性——灰色关联分析

1、作用 对于两个系统之间的因素&#xff0c;其随时间或不同对象而变化的关联性大小的量度&#xff0c;称为关联度。在系统发展过程中&#xff0c;若两个因素变化的趋势具有一致性&#xff0c;即同步变化程度较高&#xff0c;即可谓二者关联程度较高&#xff1b;反之&#xff…

【关联分析实战篇】为什么 BI 软件都搞不定关联分析

文章目录 做不好关联分析的原因在数据模型层面解决关联给业务人员看的懂的数据结构多级关联表自关联表互关联表重复关联表 结语润乾报表资料 事物都是普遍联系的&#xff0c;很难有一个独立的事物不和其它发生关联&#xff0c;数据表也一样&#xff0c;很多有业务意义的查询都会…

因果分析与关联分析的联系

因果分析中的关联分析 因果分析的发现在大数据背景下变得越发重要&#xff0c;在数据分析领域&#xff0c;人们开始尝试着利用人工智能对数据进行因果分析&#xff0c;但一个因果关系的得出是错综复杂的&#xff0c;不单单是通过机器就能够解决的。 在数据分析中&#xff0c;…