考虑用第一类斯特林数的生成函数来解这个问题。设 fx(n) 是第 n 行第一类斯特林数组成的生成函数,则有:fx(n)=i=0∑n[ni]xi=i=0∏n−1(x+i)。
现在要求 fx(n) 的每一项系数,容易想到用分治 NTT 做到 O(nlog2n),据说卡卡常能过。这里给出一种 O(nlogn) 求多项式系数的解法。
先考虑 n=2p 的情况。此时容易想到倍增求解,即用 fx(n) 的多项式系数直接推出 fx(2n) 的多项式系数。
可以推式子:
fx(2n)=i=0∏2n−1(x+i)=i=0∏n−1(x+i)×i=0∏n−1(x+n+i)=fx(n)×fx+n(n)
问题在于求 fx+k(n) 的值。考虑用 fx 来表示出 fx+k(n) 的值:
fx+n(n)=i=0∑nai(x+k)i=i=0∑naij=0∑i(ji)xjki−j=j=0∑ni=j∑nai(ji)xjki−j=j=0∑nxji=j∑naiki−jj!(i−j)!i!=j=0∑nj!xji=j∑naiki−j(i−j)!i!=j=0∑nj!xji=j∑n(i!ai)×((i−j)!ki−j)
设 Ai=i!ai,Bi=(i−j)!ki−j,则后半段和式是等差卷积的形式,可以翻转 B 数组然后令 C=A⊙B(即 C 是 A,B 两个数组的卷积),前半部分的 j!1 以及 A 内的 i!,B 内的 i!,ki 等部分都可以线性递推。
然后再考虑 n=2p 的情况。此时考虑类比快速幂的求法:
- 若 2∣n,则直接按上面的步骤分治。
- 否则,先求出 f(n−1) 的值(这个时候必有 2∣n−1 可以分治处理),然后问题是从 f(n−1) 推出 f(n)。这个部分是简单的,给多项式乘一个 x+n 即可,时间复杂度是线性。
考虑使用主定理来分析时间复杂度,有:T(n)=T(2n)+O(nlogn)=O(nlogn),显然可以轻松通过该题。
一个要注意的点是模数 225×5+1 的原根为 3,不是 5。
喜欢的话,留下你的评论吧~