伯努利数 & 对称多项式

从这么一个式子开始说起 \(F(x) = \prod_{i=1}^n (1+a_i x)\)

\[ \begin{aligned} ln F(x) &= \sum_{i=1}^n \ln (1+a_ix)\\ &= \sum_{i=1}^n \sum_{j>0} (-1)^{j-1}\frac{a_i^j}{j}x^j\\ &= \sum_{j>0} (-1)^{j-1}\frac{\sum_{i=1}^n a_i^j}{j}x^j\\ &= \sum_{j>0} (-1)^{j-1}\frac{e_j}{j}x^j\\ \end{aligned} \]

如果 \(e\) 能够 \(O(n\log n)\), 那这个式子不就可以做到 \(O(n\log n)\) 了?

定义 \(e, p\) 是作用在 \((a_1, a_2,\cdots, a_n)\) 上的函数
\[e_k = \sum_{i=1}^n a_i^k\\ p_k = \sum_{s\subseteq 2^n, |s|=k} \prod_{i\in s} a_i\]
可以发现对\(a\)进行任意多次任意交换, 不影响上述两个式子的值, 这符合对称多项式的定义

可以发现 \(F(x)\)\(p\)\(OGF\)
我们一开始的那段推导就给出了一个 : 已知 \(e\)\(p\)\(O(n\log n)\) 做法

2017 thupc I Sum
给你 \(a_1\cdots a_n\), 求 \(e_1\cdots e_n\)
参考了一些网上的人的博客以及当时的官方题解, 似乎都是要两个 \(\log\). 凉了...
还是讲一下那题的做法吧, 用到一个已知 \(p\)\(e\)\(O(n\log n)\) 做法

考虑用 \(e_1\to e_{n-1}, p_1\to p_n\) 去表示 \(e_n\)
首先将 \(x^n\) 视作 \(x^{n-1} * x\), 碰运气用 \(e_{n-1} * p_1\), 此时有可能产生形如 \(x^{n-1}y\) 的项, 每种形式恰好一个
然后将 \(x^{n-1}y\) 视作 \(x^{n-2} * xy\), 碰运气用 \(e_{n-2} * p_2\), 此时有可能产生形如 \(x^{n-2}yz\) 的项, 每种形式恰好一个
接着将 \(x^{n-2}yz\) 视作 \(x^{n-3} * xyz\), 碰运用 \(e_{n-3} * p_3\). 依次类推...
特别的, 到最后产生形如 \(a_1a_2\cdots a_n\) 的项时, 就不是每种形式恰好一个了, 而是恰好 \(n\)

容斥一下就是 \(e_n = \sum_{i=1}^{n-1} (-1)^{i-1} e_{n-i} p_i + (-1)^{n-1} np_n\)
写好看一点是 \((-1)^{n-1}e_n = \sum_{i=1}^{n-1} ((-1)^{n-i} e_{n-i}) p_i + np_n\)
\(i>n\)\(p_i=0\), \(e_i\) 仍然满足上述等式.
\(e_0=p_0=0\) 就可以多项式求逆做了.

虽然 \(p\)\(e\) 之间的相互转化都可以 \(O(n\log n)\)
但是求 \(p\) 依赖于 \(e\), 求 \(e\) 又依赖于 \(p\), 我们得先算出其一
\(e\) 在一般情况下比 \(p\) 难求得多, 那么这里我们就只能用分治FFT来求 \(p\)

但是 \(e\) 在某些特殊情况下是能做到计算时间比 \(p\) 优的. 如在 \(a_i=i\) 时, 就不难想到伯努利数.
\[e^{dx} = \sum_{i} \frac{d^i}{i!}x^i\\ e_k=k![x^k](\sum_{d=0}^{n} e^{dx}) = [x^k]\frac{e^{(n+1)x}-1}{e^x-1}\]
复杂度只与最大幂次有关, 与 \(n\)无关

2017 集训队 多项式求和
\(f_0(x)=1, f_k(x)=\sum_{i=0}^x (ai^2+bi+c)f_{k-1}(i)\)
要求对于 \(n(2e5), m(1e9)\), 求出 \(f_i(m),\forall 0\le i \le n\)

扫描二维码关注公众号,回复: 875861 查看本文章

构造多项式 \(g_n(x)\)
\[ \begin{aligned} g_n(x) &= \sum_{k\ge 0} f_k(n)x^k\\ &= f_0(n) + \sum_{k\gt 0} (\sum_{i=0}^n (ai^2+bi+c) f_{k-1}(i))x^k\\ &= f_0(n) + (an^2+bn+c) \sum_{k\gt 0} f_{k-1}(n)x^k + \sum_{k\gt 0} (\sum_{i=0}^{n-1} (ai^2+bi+c) f_{k-1}(i))x^k\\ &= f_0(n) + (an^2+bn+c) \sum_{k\ge 0} f_k(n)x^{k+1} + \sum_{k\gt 0} f_k(n-1)x^k\\ &= (an^2+bn+c)x g_n(x) + g_{n-1}(x) + f_0(n) - f_0(n-1)\\ \end{aligned} \]

这题里面 \(f_0(n)-f_0(n-1) = 0\)
因此有 \[g_n(x) = \frac{g_{n-1}(x)}{1-(an^2+bn+c)x}, g_0(x)=\frac{1}{1-cx}\]
(插个题外话 : \(f_0(n)-f_0(n-1) \neq 0\)\(m\le 1e5\) 时可以考虑分治FFT来补上这些项对答案的贡献)
求出 \(g_m\) 的前 \(n\) 项系数即可, 问题转化为求 \(\prod_{i=1}^{m} 1-(ai^2+bi+c)x\pmod {x^n}\)
用文章最开头的方法去做, 转化为 \(\forall 0\lt j\le n, 求\sum_{i=1}^m (ai^2+bi+c)^j\)
\(a=0\) 时可以直接二项式定理展开, 然后卷积求
\(a\neq 0\) 时类似这么做得到 \(\sum_{k=0}^j \binom j k c^{j-k} \sum_{d=0}^k \binom k d b^{k-d} a^d \sum_{i=1}^m i^{d+k}\)
并不能比较快的求(可能我太菜)
参考集训队论文里的方法:
\[ \begin{aligned} &\sum_{i=1}^m (ai^2+bi+c)^j\\ &=\sum_{i=1}^m (a(i^2+\frac b a i+\frac c a))^j\\ &令u=\frac b {2a}, v = \frac c a\\ &=a^j\sum_{i=1}^m (i^2+2ui+u^2+v-u^2)^j\\ &=a^j \sum_{k=0}^j \binom k j (v-u^2)^{j-k} \sum_{i=1}^m (i+u)^k\\ \end{aligned} \]
后者是 \(a=0\) 的情况, 前后卷积一下即可

参考资料

wiki Symmetric Polynomial
zzq's blog 初等对称轮换多项式简单应用

猜你喜欢

转载自www.cnblogs.com/acha/p/9048249.html