在这一篇文章里,我们来谈一谈上升幂,下降幂多项式,斯特林数以及一些优美的结论。
前言
如果有什么比如说像链接有问题或者是别的问题,包括不懂的,请在下面发讨论。
下降幂多项式的定义
下降幂多项式($\texttt{Falling Factorial Polynomial}$,也即$\texttt{FFP}$),也称下降阶乘幂多项式,是一类特殊的多项式。
首先,看一下下降幂单项式的递归定义:
所以说,$x^{\underline 0}=1$,那么$x^{\underline 1}$呢?
那么有
于是可以得出一个普遍的结论,就是
$x^{\underline n}=n!C^n_x$这个公式很重要,因为$x^{\underline n}$与两类斯特林数有强关联。
那么,下降幂多项式,是由许多个下降幂单项式相加得来的,如
普通多项式转下降幂多项式
首先看一个简单的结论:
其中$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 | inline void polyToFFP(ll fd,ll *f,ll *res) |
下降幂多项式乘法
首先,拿题目的样例来解释一下:
$\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 | inline void FFPMul(ll fd,ll gd,ll *f,ll *g,ll *res) |
第二类斯特林数·行
不知道第二类斯特林数的去看组合专题(大坑)。
还记得上面那个有关于第二类斯特林数的结论吗?
可是这又与这题有什么关系呢?
很明显,$m\leq n$,所以把和式上界改一下,为后续做准备
然后再设$f(n)=n^m,g(i)=i!S^i_m$,那么有
这是什么?二项式反演啊,所以反演一下
再换回来
把阶乘除过去,把组合数拆出来
约个分
然后再拆一下
很明显的卷积形式啊。。。$\texttt{NTT}$做就行啦qwq
时间复杂度$O(n\log n)$
代码呢?不见了。。。
第二类斯特林数·列
我们先从一个小结论入手(从维基百科蒯的):
证明留给读者做练习这掩盖不了我不会证的事实
这里主要讲讲求法。
很明显的把$e^x-1$拆开
构造这样一个多项式,$n$次方之后对每一个系数乘上$n!$的逆元,再对于$x^i$的系数乘上$i!$就没了
时间复杂度$O(n\log n)$,代码无。
第一类斯特林数·列
先看一个恒等式
你可能会想,这样一个恒等式与斯特林数有啥关系嘛。且听我慢慢道来。
左边二项式展开,右边化成指数形式,有
当$i>n$时,显然,$C_n^i=0$,所以左边改变求和上界,右边泰勒展开,有
把组合数拆成下降幂的形式
下降幂拆成第一类斯特林数
整理一下
两边约掉
这样就没了啊。。。用多项式$\ln$和快速幂做,时间复杂度$O(n\log n)$
第一类斯特林数·行
应$\texttt{M}$$\texttt{_sea}$的要求,这里终于不咕咕了。
这里可是最最最卡常的地方了!
首先,我们可以自然的想到一个做法。原理是这样
而
所以考虑直接分治乘法即可,时间复杂度$O(n\log^2n)$
可是这样过不去。考虑倍增,有
假设$F(x)=x^{\overline n}$,我们当前的目标是求出$F(x+n)$,所以
强行展开
合并一下
把$i!f_i$翻转一下做一次卷积即可。时间复杂度$O(n\log n)$,要卡卡常。