P4705 玩游戏

有两个非负整数序列,我们称其为\(a_1\cdots a_n\)和\(b_1\cdots b_m\)。每次游戏中玩家会从\(a\)序列和\(b\)序列中分别随机地抽取一个数,假设抽出的数为\(a_i,b_j\),则定义这次游戏的\(k\)次价值为:\((a_i+b_j)^k\)。要求对于每个\(k\in [1,t]\)的\(k\)次价值的期望,对\(998244353\)取模。\(n,m,t\leq 10^5,a_i,b_j\leq 998244352\)。


显然有答案=\(\frac{\sum_{i=1}^n\sum_{j=1}^m(a_i+b_j)^k}{nm}\)。我们只关注分子的式子,把它用二项式定理展开一下就有:

\[\sum_{i=1}^{n}\sum_{j=1}^m\sum_{p=0}^k{k\choose p}a_i^pb_j^{k-p} \\=k!\sum_{p=0}^k\sum_{i=1}^n\frac{a_i^p}{p!}\sum_{j=1}^m\frac{b_j^{k-p}}{(k-p)!} \]

观察到后面的两个求和式中分子的指数和分母的阶乘是一样的,那么可以写成指数型生成函数的形式,下面以第一个求和式为例:

\[A(x)=\sum_{p=0}(\sum_{i=1}^na_i^p)\frac{x^p}{p!} \]

那么答案式子就可以写成\(k![x^k]A(x)B(x)\)。现在问题就是要计算\(A(x)\)和\(B(x)\)的系数。

仍然写出系数的生成函数,以\(A(x)\)为例,就有:

\[F_A(x)=\sum_{p=0}(\sum_{i=1}^na_i^p)x^p = \sum_{i=1}^n\sum_{p=0}(a_ix)^p = \sum_{i=1}^n\frac{1}{1-a_ix} \]

怎么计算最后这个多项式呢?普通的做法就是通分,分母的多项式相乘,分子与分母交叉相乘再相加。但如果从左往右加过去开销就很大。我们可以用分治的思想,每次把问题折半,先算左边和右边的\(\frac{n}{2}\)规模的问题,然后左右两边通分加起来。复杂度就是\(O(nlog^2n)\)的

上一篇:[学习笔记]进阶指南day1


下一篇:数理统计7:矩法估计(MM)、极大似然估计(MLE),定时截尾实验