博文目录

题目大意

本题中约定 $0^0 = 1$。

Snuke 使用动态规划解决了一道题目。具体来说,她设计了如下递推式:

\[F(i, j) = \begin{cases} 0, & \text{if $i = 0$;} \\ f_i, & \text{if $i > 0$ and $j = 0$;} \\ aF(i - 1, j) + bF(i, j - 1) + c, & \text{if $i > 0$ and $j > 0$.} \end{cases}\]

其中 $i,j$ 是非负整数,$a,b,c$ 是给定的常数,$f_i$ 是给定的数列。

Snuke 需要求出 $F(n,m)$,所以她对于 $1 \le i \le n, 1 \le j \le m$ 计算了 $F(i,j)$,这些值形成了一个 $n \times m$ 的矩阵。

Takahashi 希望你告诉她这个矩阵。为了避免过多的输出,你只需要输出这个矩阵的哈希值。

具体来说,给定整数 $h$ 和质数 $p$,你需要输出

\[\left( \sum_{i = 1}^{n} \sum_{j = 1}^{m} F(i, j) \, h^{(i - 1)m + (j - 1)} \right) \bmod p\]

的值。

题解

一道分类讨论+推式子好题。

我们分两步计算贡献。分别是每个 $f_i$ 以及 $c$ 的贡献。

Step 1

对于每个 $f_i$ 我们可以发现其总贡献为

\[\begin{aligned}&\sum_{x=1}^{n}f_x\sum_{i=x}^{n}\sum_{j=1}^{m}\binom{i-x+j-1}{j-1}a^{i-x}b^{j}h^{(i-1)m+(j-1)} \\ \Rightarrow &\sum_{x=1}^{n}f_x\sum_{i=x}^{n}a^{i-x}h^{(i-1)m}\sum_{j=0}^{m}\binom{i-x+j-1}{j-1}b^{j}h^{j-1} \\ \Rightarrow &\sum_{x=1}^{n}f_x\sum_{i=0}^{n-x}a^ih^{(i+x)m}\sum_{j=0}^{m-1}\binom{i+j}{j}b^{j+1}h^{j} \end{aligned}\]

那么如何计算这个式子呢?我们定义一个函数 $F(x)$ 为

\[\sum_{j=0}^{m-1}\binom{x+j}{j}b^{j+1}h^{j}\]

那么我们可以得到:

\[\begin{aligned} F(x) &= \sum_{j=0}^{m-1}\binom{x+j}{j}b^{j+1}h^{j} \\ &=\sum_{j=0}^{m-1}\binom{x+j-1}{j}b^{j+1}h^j+\sum_{j=0}^{m-1}\binom{x+j-1}{j-1}b^{j+1}h^j \\ &=F(x-1)+\sum_{j=0}^{m-2}\binom{x+j}{j}b^{j+2}h^{j+1}\\ &=F(x-1)+bh\sum_{j=0}^{m-1}\binom{x+j}{j}b^{j+1}h^{j}-\binom{x+m-1}{m-1}b^{m+1}h^{m}\\ &=F(x-1)+bhF(x)-\binom{x+m-1}{m-1}b^{m+1}h^{m}\\ &=\frac{F(x-1)-\binom{x+m-1}{m-1}b^{m+1}h^{m}}{1-bh} \end{aligned}\]

再定义函数 $R(x)$ 为

\[\binom{x+m-1}{m-1}b^{m+1}h^{m}\]

那么有

\[\begin{aligned} R(x)&=\frac{x+m-1}{x}\binom{x+m-2}{m-1}b^{m+1}h^m \\ &=\frac{x+m-1}{x}R(x-1) \end{aligned}\]

所以我们可以得到

\[F(x)=\frac{F(x-1)-R(x)}{1-bh}\]

当 $bh=1$ 时,上述公式不适用,需要特判。根据之前的推导过程,有

\[\begin{aligned} (1-bh)F(x)&=F(x-1)-R(x) \\ 0&=F(x-1)-R(x) \\ F(x)&=R(x+1) \end{aligned}\]

这样就可以 $O(n)$ 递推 $F(x)$ 和 $R(x)$ 了。

对于初值问题,当 $bh\not=1$ 时,有

\[F(0)=\sum_{j=0}^{m-1}b^{j+1}h^{j}=\frac{b-b^{m+1}h^{m}}{1-bh}\]

当 $bh=1$ 时,有

\[F(0)=\sum_{j=0}^{m-1}b=mb\]

对于函数 $R(x)$ ,没有特殊情况。

\[R(0)=b^{m+1}h^{m}\]

接下去我们定义函数 $G(x)$ 为

\[\sum_{i=0}^{n-x}a^ih^{(i+x-1)m}F(i)\]

推一下式子:

\[\begin{aligned} G(x)&=\sum_{i=0}^{n-x+1}a^ih^{(i+x-1)m}F(i)-a^{n-x+1}h^{nm}F(n-x+1) \\ &=h^mG(x-1)-a^{n-x+1}h^{nm}F(n-x+1) \end{aligned}\]

这个递推式也没有特殊情况。初值为

\[G(0)=\sum_{i=0}^{n}a^ih^{(i-1)m}F(i)\]

综上,这一部分的贡献总和就是

\[\sum_{x=1}^nf_xG(x)\]

计算复杂度 $O(n)$ 。

Step 2

接下去计算 $c$ 的贡献。其总贡献为:

\[\begin{aligned} &\sum_{x=1}^{n}\sum_{y=1}^{m}\sum_{i=0}^{x-1}\sum_{j=0}^{y-1}\binom{i+j}{j}a^ib^jch^{(x-1)m+(y-1)} \\ \Rightarrow \;&c\sum_{x=1}^{n}h^{(x-1)m}\sum_{i=0}^{x-1}a^i\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-1}\binom{i+j}{j}b^j \end{aligned}\]

我们定义函数 $P(x)$ 为

\[a^{x}\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-1}\binom{x+j}{j}b^j\]

再推一波式子:

\[\begin{aligned} P(x)&=a^{x}\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-1}\binom{x+j}{j}b^j\\ &= a^x\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-1}\binom{x+j-1}{j}b^j+a^x\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-1}\binom{x+j-1}{j-1}b^j\\ &=aP(x-1)+a^x\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-2}\binom{x+j}{j}b^{j+1} \\ &=aP(x-1)+a^x\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-1}\binom{x+j}{j}b^{j+1}-a^x\sum_{y=0}^{m-1}h^{y}\binom{x+y}{y}b^{y+1} \\ &=aP(x-1)+bP(x)-a^xF(x)\\ &=\frac{aP(x-1)-a^xF(x)}{1-b} \end{aligned}\]

当 $b=1$ 时,递推式又会萎。

\[\begin{aligned} (1-b)P(x)&=aP(x-1)-a^xF(x) \\ 0&=aP(x-1)-a^xF(x) \\ P(x)&=a^xF(x+1) \end{aligned}\]

$P(x)$ 的初值问题比较麻烦。

当 $b\not=1, h\not=1, bh\not=1$ 时,有

\[\begin{aligned}P(0)&=\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-1}b^j \\ &=\sum_{y=1}^mh^{y-1}\frac{1-b^y}{1-b} \\ &=\frac{b}{1-b}\left(\sum_{y=1}^mh^{y-1}-\sum_{y=1}^mh^{y-1}b^{y}\right) \\ &=\frac{1}{1-b}\left(\frac{1-h^m}{1-h}-\frac{b-h^mb^{m+1}}{1-bh}\right) \end{aligned}\]

当 $b=1, h\not=1$ 时,有

\[P(0)=F(1)\]

当 $b\not=1, h=1$ 时,有

\[\begin{aligned} P(0)&=\sum_{y=1}^m\sum_{j=0}^{y-1}b^j \\ &=\sum_{y=1}^m\frac{1-b^y}{1-b} \\ &=\frac{1}{1-b}\sum_{y=1}^m(1-b^y) \\ &=\frac{1}{1-b}\left(m-\frac{b-b^{m+1}}{1-b}\right) \end{aligned}\]

当 $b=h=1$ 时,有

\[\begin{aligned} P(0)&=\sum_{y=1}^m\sum_{j=0}^{y-1}1 \\ &=\frac{m(m+1)}{2} \end{aligned}\]

当 $b\not=1, h\not=1, bh=1$ 时,有

\[\begin{aligned}P(0)&=\sum_{y=1}^mh^{y-1}\sum_{j=0}^{y-1}b^j \\ &=\frac{b}{1-b}\left(\sum_{y=1}^mh^{y-1}-\sum_{y=1}^mh^{y-1}b^{y}\right) \\ &=\frac{1}{1-b}\left(\frac{1-h^m}{1-h}-mb\right) \end{aligned}\]

然后这一部分的贡献就是

\[c\sum_{x=1}^nh^{(x-1)m}\sum_{i=0}^{x-1}P(i)\]

$O(n)$ 计算 $P(x)$ 之后前缀和一下,再 $O(n)$ 计算贡献。

Step 3

最后,把上面两部分贡献数值相加就是最终答案。总复杂度 $O(n)$ 。

我感到以上某些式子有更简单的推法能得到更简单的答案,并且这个做法常数略大,uoj 上跑了 18291ms ,用了 Fastdiv 之后 6321ms ,快三倍,成功挤进第一页 233333。

再%%%lsk