多项式牛顿级数_笔记

牛顿级数

f ( x ) = a d x d + a d − 1 x d − 1 + . . . + a 1 x 1 + a 0 x 0 f(x)=a_dx^d+a_{d-1}x^{d-1}+...+a_1x^1+a_0x^0 f(x)=adxd+ad1xd1+...+a1x1+a0x0

由于某种原因,它可以表示为下降幂的形式
f ( x ) = b d x d ‾ + b d − 1 x d − 1 ‾ + . . . + b 1 x 1 ‾ + b 0 x 0 ‾ f(x)=b_dx^{\underline{d}}+b_{d-1}x^{\underline{d-1}}+...+b_1x^{\underline{1}}+b_0x^{\underline{0}} f(x)=bdxd+bd1xd1+...+b1x1+b0x0
因为有 ( x k ) = x k ‾ k ! {x\choose k}=\frac{x^{\underline{k}}}{k!} (kx)=k!xk

所以可以写成组合数的形式,也叫牛顿级数
f ( x ) = c d ( x d ) + c d − 1 ( x d − 1 ) + . . . + c 1 ( x 1 ) + c 0 ( x 0 ) f(x)=c_d{x\choose d}+c_{d-1}{x\choose d-1}+...+c_1{x\choose 1}+c_0{x\choose 0} f(x)=cd(dx)+cd1(d1x)+...+c1(1x)+c0(0x)
考虑它的差分
Δ ( f ( x ) ) = f ( x + 1 ) − f ( x ) = c d ( x d − 1 ) + c d − 1 ( x d − 2 ) + . . . + c 1 ( x 0 ) \Delta (f(x))=f(x+1)-f(x)=c_d{x\choose d-1}+c_{d-1}{x\choose d-2}+...+c_1{x\choose 0} Δ(f(x))=f(x+1)f(x)=cd(d1x)+cd1(d2x)+...+c1(0x)
同理得它的 n n n 阶差分
Δ n ( f ( x ) ) = c d ( x d − n ) + c d − 1 ( x d − 1 − n ) + . . . + c 1 ( x 1 − n ) + c 0 ( x − n ) \Delta^n (f(x))=c_d{x\choose d-n}+c_{d-1}{x\choose d-1-n}+...+c_1{x\choose 1-n}+c_0{x\choose -n} Δn(f(x))=cd(dnx)+cd1(d1nx)+...+c1(1nx)+c0(nx)
显然
Δ n ( f ( 0 ) ) = { c n n ≤ d 0 n > d \Delta^n(f(0))=\begin{cases}c_n &n\le d \\ 0 &n>d \end{cases}\\ Δn(f(0))={cn0ndn>d
所以就有
f ( x ) = Δ d ( f ( 0 ) ) ( x d ) + Δ d − 1 ( f ( 0 ) ) ( x d − 1 ) + . . . + Δ ( f ( 0 ) ) ( x 1 ) + f ( 0 ) c 0 ( x 0 ) f(x)=\Delta^d(f(0)){x\choose d}+\Delta^{d-1}(f(0)){x\choose d-1}+...+\Delta(f(0)){x\choose 1}+f(0)c_0{x\choose 0} f(x)=Δd(f(0))(dx)+Δd1(f(0))(d1x)+...+Δ(f(0))(1x)+f(0)c0(0x)

推一推式子

λ f ( x ) = f ( x + 1 ) \lambda f(x)=f(x+1) λf(x)=f(x+1)

那么
Δ f ( x ) = λ f ( x ) − f ( x ) = ( λ − 1 ) f ( x ) Δ n f ( x ) = ( λ − 1 ) n f ( x ) = ∑ k ≥ 0 ( n k ) ( − 1 ) n − k λ k f ( x ) = ∑ k ≥ 0 ( n k ) ( − 1 ) n − k f ( x + k ) Δ n f ( 0 ) = ∑ k ≥ 0 ( n k ) ( − 1 ) n − k f ( k ) \begin{aligned} \Delta f(x)&=\lambda f(x)-f(x) \\ &=(\lambda-1)f(x)\\ \\ \Delta^nf(x)&=(\lambda-1)^nf(x)\\ &=\sum_{k\ge0}{n\choose k}(-1)^{n-k}\lambda^kf(x)\\ &=\sum_{k\ge0}{n\choose k}(-1)^{n-k}f(x+k)\\ \\ \Delta^n f(0)&=\sum_{k\ge0}{n\choose k}(-1)^{n-k}f(k)\\ \end{aligned} Δf(x)Δnf(x)Δnf(0)=λf(x)f(x)=(λ1)f(x)=(λ1)nf(x)=k0(kn)(1)nkλkf(x)=k0(kn)(1)nkf(x+k)=k0(kn)(1)nkf(k)
推到这里不知道有啥用,反正本来就只能 O ( n 2 ) O(n^2) O(n2)(忽略废话

康康题目

luogu 7438

cyc \text{cyc} cyc 将长为 n n n 的排列 π \pi π 当成置换时所能分解成的循环个数。给定两个整数 n , k n,k n,k 和一个 k − 1 k-1 k1次多项式,对 1 ≤ m ≤ n 1\leq m\leq n 1mn 求:
∑ π F ( cyc π ) \sum\limits_{\pi}F(\text{cyc}_{\pi}) πF(cycπ)
其中 π \pi π 是长度为 m m m 且不存在位置 i i i 使得 π i = i \pi_i=i πi=i 的排列。 1 ≤ n ≤ 6 × 1 0 5 , 1 ≤ k ≤ 100 1\le n\le6\times10^5,1\le k\le 100 1n6×105,1k100

简要题解

把多项式 F ( x ) F(x) F(x) 写成牛顿级数
F ( x ) = ∑ i = 0 k − 1 a i ( x i ) F(x)=\sum_{i=0}^{k-1} a_i{x\choose i} F(x)=i=0k1ai(ix)
现在问题变成求出答案的每一项,即对于每一个 m ( 1 ≤ m ≤ n ) m(1\leq m\leq n) m(1mn) i ( 0 ≤ i < k ) i(0\le i<k) i(0i<k) ∑ π ( cyc π i ) \sum_{\pi}{\text{cyc}_\pi\choose i} π(icycπ) π \pi π 是长度为 m m m 的错排, cyc π \text{cyc}_\pi cycπ 表示错排的环数。

考虑错排的生成函数,首先我们知道一个环的 E G F EGF EGF
H = ∑ i > 0 ( i − 1 ) ! i ! x i = ∑ i > 0 x i i = − ln ⁡ ( 1 − x ) H=\sum_{i>0} \frac{(i-1)!}{i!}x^i= \sum_{i>0} \frac{x^i}{i}=-\ln(1-x) H=i>0i!(i1)!xi=i>0ixi=ln(1x)
一个错排是由若干个环(无自环)组成的,所以错排的 E G F EGF EGF
G = e − ln ⁡ ( 1 − x ) − x G=e^{-\ln(1-x)-x} G=eln(1x)x
− x -x x 是因为要去除自环。

这道题是要我们求从若干个环中选若干个的答案, 所以加一元 y y y 表示选了多少个环,于是就表示成
G = e ( − ln ⁡ ( 1 − x ) − x ) × ( 1 + y ) G=e^{(-\ln(1-x)-x)\times(1+y)} G=e(ln(1x)x)×(1+y)
g a , b = [ x a y b ] G g_{a,b}=[x^ay^b]G ga,b=[xayb]G,也就是说长度为 m m m 的错排中选 i i i 个环的方案数的和为 m ! g m , i m!g_{m,i} m!gm,i ,也就是我们要求的 ∑ π ( cyc π i ) \sum_{\pi}{\text{cyc}_\pi\choose i} π(icycπ)

直接暴力上多项式牛迭复杂度就飞了。

G G G 上对 x x x 求导
G ( x ) ′ = x ( 1 + y ) 1 − x G G(x)'=\frac{x(1+y)}{1-x}G G(x)=1xx(1+y)G
那么
( n + 1 ) g n + 1 , k = ∑ i = 0 n − 1 g i , k + g i , k − 1 = n × g n , k + g n − 1 , k + g n − 1 , k − 1 (n+1)g_{n+1,k}=\sum_{i=0}^{n-1}g_{i,k}+g_{i,k-1}\\ =n\times g_{n,k}+g_{n-1,k}+g_{n-1,k-1} (n+1)gn+1,k=i=0n1gi,k+gi,k1=n×gn,k+gn1,k+gn1,k1
O ( n k ) O(nk) O(nk) 递推即可。

#include <bits/stdc++.h>
#define N 600005
#define K 102 
using namespace std;
typedef long long ll;
const int mod=998244353;
ll g[N][K],n,k,fac[N],inv[N];
ll a[K],A[K][K];
ll ksm(ll x,ll y){
	ll res=1;
	while(y){
		if(y&1) res=res*x%mod; 
		x=x*x%mod; y>>=1;
	}
	return res;
}
void init(){
	fac[0]=1;
	for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	inv[n]=ksm(fac[n],mod-2);
	for(int i=n-1;i>=0;i--) 
		inv[i]=inv[i+1]*(i+1)%mod,inv[i+1]=inv[i+1]*fac[i]%mod;
}
void get_G(){
	g[2][0]=inv[2],g[2][1]=inv[2];
	for(ll i=3;i<=n;i++){
		g[i][0]=((i-1)*g[i-1][0]%mod+g[i-2][0])*inv[i]%mod;
		for(int j=1;j<k;j++)
			g[i][j]=((i-1)*g[i-1][j]%mod+g[i-2][j]+g[i-2][j-1])*inv[i]%mod;
	}
}
ll get_A(ll x){
	ll res=0,X=1;
	for(int i=0;i<k;i++,X=X*x%mod) res=(res+X*a[i]%mod)%mod;
	return res;
}
int main(){
//	freopen("test.in","r",stdin);
	cin>>n>>k;
	init();
	get_G();
	for(int i=0;i<k;i++) cin>>a[i];
	for(int i=0;i<k;i++) A[0][i]=get_A(i);
	for(int i=k,op=1;i>1;i--,op++)
		for(int j=0;j<i-1;j++)
			A[op][j]=(A[op-1][j+1]-A[op-1][j]+mod)%mod;
	for(int i=0;i<k;i++) a[i]=A[i][0];
	for(int m=1;m<=n;m++){
		ll res=0;
		for(int i=0;i<k;i++)
			(res+=g[m][i]%mod*a[i]%mod)%=mod;
		cout<<fac[m]*res%mod<<' ';
	}
}
posted @ 2022-10-10 20:18  缙云山车神  阅读(121)  评论(0编辑  收藏  举报