多项式牛顿级数_笔记
牛顿级数
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+ad−1xd−1+...+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+bd−1xd−1+...+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)+cd−1(d−1x)+...+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(d−1x)+cd−1(d−2x)+...+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(d−nx)+cd−1(d−1−nx)+...+c1(1−nx)+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))={cn0n≤dn>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)+Δd−1(f(0))(d−1x)+...+Δ(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)=k≥0∑(kn)(−1)n−kλkf(x)=k≥0∑(kn)(−1)n−kf(x+k)=k≥0∑(kn)(−1)n−kf(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
k−1次多项式,对
1
≤
m
≤
n
1\leq m\leq n
1≤m≤n 求:
∑
π
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
1≤n≤6×105,1≤k≤100 。
简要题解
把多项式
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=0∑k−1ai(ix)
现在问题变成求出答案的每一项,即对于每一个
m
(
1
≤
m
≤
n
)
m(1\leq m\leq n)
m(1≤m≤n) 和
i
(
0
≤
i
<
k
)
i(0\le i<k)
i(0≤i<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>0∑i!(i−1)!xi=i>0∑ixi=−ln(1−x)
一个错排是由若干个环(无自环)组成的,所以错排的
E
G
F
EGF
EGF 为
G
=
e
−
ln
(
1
−
x
)
−
x
G=e^{-\ln(1-x)-x}
G=e−ln(1−x)−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(1−x)−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)′=1−xx(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=0∑n−1gi,k+gi,k−1=n×gn,k+gn−1,k+gn−1,k−1
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<<' ';
}
}