学习笔记·多项式专题(三)

在这一篇文章里,我们来谈一谈上升幂,下降幂多项式,斯特林数以及一些优美的结论。

前言

如果有什么比如说像链接有问题或者是别的问题,包括不懂的,请在下面发讨论。

下降幂多项式的定义

下降幂多项式($\texttt{Falling Factorial Polynomial}$,也即$\texttt{FFP}$),也称下降阶乘幂多项式,是一类特殊的多项式。

首先,看一下下降幂单项式的递归定义:

所以说,$x^{\underline 0}=1$,那么$x^{\underline 1}$呢?

那么有

于是可以得出一个普遍的结论,就是

$x^{\underline n}=n!C^n_x$这个公式很重要,因为$x^{\underline n}$与两类斯特林数有强关联。

那么,下降幂多项式,是由许多个下降幂单项式相加得来的,如

普通多项式转下降幂多项式

Luogu P5383

首先看一个简单的结论:

其中$S$表示第二类斯特林数。

为什么呢?考虑等号两边的组合意义。

左边是$n$个球任意放$m$个盒子的答案,右边的话枚举非空盒子的数量,用组合数枚举一下,最后由于盒子不同,所以要乘个$i!$。

所以,把它拓展一下,得到一个跳跃性结论:

这时,我们看到了$i!C_i^x$的形式,考虑把它转成下降幂多项式,那么就会有

于是我们就把普通单项式转换成了一个下降幂单项式。但如果拓展成普通多项式,结论又会是什么?

设$n$次多项式$F(x)$的系数数列为$f$,那么有

把结论用上去,有

这里有一个小$\texttt{trick}$,改变求和顺序!所以说

本来$i$的下界应该是$0$的,但是当$i<j$时$S_i^j=0$,所以可以将$i$的下界改成$j$。

这就是一个下降幂多项式的形式了,看来问题解决了!但是后面一长串和式该怎么求?

这里有一个小结论:(证明在下面,用心找可以找得到)

所以,把结论用上去啊。。。

改变求和顺序,有

这就是卷积的形式了,直接$\texttt{NTT}$就好啦qwq。但是求后面那个和式要多点求值。

接着就是神奇的上代码环节啦。。。(包括预处理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
inline void polyToFFP(ll fd,ll *f,ll *res)
{
static ll pts[MAXN>>1],tmp[MAXN],tmp2[MAXN];
for(register int i=0;i<fd;i++)
{
pts[i]=i,tmp[i]=(i&1)?MOD-finv[i]:finv[i];
}
eval(fd,fd,f,pts,tmp2);
for(register int i=0;i<fd;i++)
{
tmp2[i]=(li)tmp2[i]*finv[i]%MOD,pts[i]=0;
}
ll cnt=1,limit=-1;
while(cnt<(fd<<1))
{
cnt<<=1,limit++;
}
for(register int i=0;i<cnt;i++)
{
rev[i]=(rev[i>>1]>>1)|((i&1)<<limit);
}
NTT(tmp2,cnt,1),NTT(tmp,cnt,1);
for(register int i=0;i<cnt;i++)
{
res[i]=(li)tmp[i]*tmp2[i]%MOD,tmp[i]=tmp2[i]=0;
}
NTT(res,cnt,-1);
}

下降幂多项式乘法

Luogu P5394

首先,拿题目的样例来解释一下:

$\quad(3x^{\underline 2}+2x^{\underline 1}+1)(4x^{\underline 3}+3x^{\underline 2}+2x^{\underline 1}+1)$
$=(3x^2-x+1)(4x^3-9x^2+7x+1)$
$=12x^5-30x^4+34x^3-12x^2+6x+1$
$=12x^{\underline 5}+89x^{\underline 4}+148^{\underline 3}+52x^{\underline 2}+8x^{\underline 1}+1$

难道要普通多项式与下降幂多项式的转换吗?题目难度告诉我们不要。但又怎么做呢?

考虑通过$\texttt{EGF}$将普通多项式与下降幂多项式建立联系,自然考虑下降幂单项式$x^{\underline n}$的$\texttt{EGF}$,设它为$g(x)$,那么有:

把$x^n$提出来并约分

改变求和符号的变量

和式就是$e^x$的麦克劳林级数,所以

设$F(x)$为下降幂多项式$f(x)$点值的$\texttt{EGF}$,$G(x)$为下降幂多项式$f(x)$系数的$\texttt{EGF}$,$f$是$f(x)$的系数数组,因为

所以

把$e^x$提出来

所以说,下降幂多项式的点值和系数是可以互相转换的。只要得到两个下降幂多项式的点值,把对应点值乘起来再转系数就可以了,这些操作都可以通过简单的多项式乘法实现。

于是上一个令人身心愉悦的代码qwq(预处理跟上面的代码一模一样)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
inline void FFPMul(ll fd,ll gd,ll *f,ll *g,ll *res)
{
static ll tmp[MAXN],tmpf[MAXN],tmpg[MAXN];
ll cnt=1,limit=-1;
for(register int i=0;i<fd;i++)
{
tmpf[i]=f[i];
}
for(register int i=0;i<gd;i++)
{
tmpg[i]=g[i];
}
for(register int i=0;i<fd+gd-1;i++)
{
tmp[i]=finv[i];
}
while(cnt<(fd+gd<<1))
{
cnt<<=1,limit++;
}
for(register int i=0;i<cnt;i++)
{
rev[i]=(rev[i>>1]>>1)|((i&1)<<limit);
}
NTT(tmpf,cnt,1),NTT(tmpg,cnt,1),NTT(tmp,cnt,1);
for(register int i=0;i<cnt;i++)
{

tmpf[i]=(li)tmpf[i]*tmp[i]%MOD,tmpg[i]=(li)tmpg[i]*tmp[i]%MOD;
}
NTT(tmpf,cnt,-1),NTT(tmpg,cnt,-1);
for(register int i=0;i<cnt;i++)
{
tmp[i]=i<fd+gd-1?(i&1?(MOD-finv[i]):finv[i]):0;
tmpf[i]=i<fd+gd-1?(li)tmpf[i]*tmpg[i]%MOD*fact[i]%MOD:0;
}
NTT(tmpf,cnt,1),NTT(tmp,cnt,1);
for(register int i=0;i<cnt;i++)
{
res[i]=(li)tmpf[i]*tmp[i]%MOD,tmpf[i]=tmpg[i]=tmp[i]=0;
}
NTT(res,cnt,-1);
}

第二类斯特林数·行

Luogu P5395

不知道第二类斯特林数的去看组合专题(大坑)。

还记得上面那个有关于第二类斯特林数的结论吗?

可是这又与这题有什么关系呢?

很明显,$m\leq n$,所以把和式上界改一下,为后续做准备

然后再设$f(n)=n^m,g(i)=i!S^i_m$,那么有

这是什么?二项式反演啊,所以反演一下

再换回来

把阶乘除过去,把组合数拆出来

约个分

然后再拆一下

很明显的卷积形式啊。。。$\texttt{NTT}$做就行啦qwq

时间复杂度$O(n\log n)$

代码呢?不见了。。。

第二类斯特林数·列

Luogu P5396

我们先从一个小结论入手(从维基百科蒯的):

证明留给读者做练习这掩盖不了我不会证的事实

这里主要讲讲求法。

很明显的把$e^x-1$拆开

构造这样一个多项式,$n$次方之后对每一个系数乘上$n!$的逆元,再对于$x^i$的系数乘上$i!$就没了

时间复杂度$O(n\log n)$,代码无。

第一类斯特林数·列

先看一个恒等式

你可能会想,这样一个恒等式与斯特林数有啥关系嘛。且听我慢慢道来。

左边二项式展开,右边化成指数形式,有

当$i>n$时,显然,$C_n^i=0$,所以左边改变求和上界,右边泰勒展开,有

把组合数拆成下降幂的形式

下降幂拆成第一类斯特林数

整理一下

两边约掉

这样就没了啊。。。用多项式$\ln$和快速幂做,时间复杂度$O(n\log n)$

第一类斯特林数·行

Luogu P5408

$\texttt{M}$$\texttt{_sea}$的要求,这里终于不咕咕了。

这里可是最最最卡常的地方了!

首先,我们可以自然的想到一个做法。原理是这样

所以考虑直接分治乘法即可,时间复杂度$O(n\log^2n)$

可是这样过不去。考虑倍增,有

假设$F(x)=x^{\overline n}$,我们当前的目标是求出$F(x+n)$,所以

强行展开

合并一下

把$i!f_i$翻转一下做一次卷积即可。时间复杂度$O(n\log n)$,要卡卡常。