组合计数 + 循环卷积.
多测不清空,爆零两行泪.
从递推式入手,简单整理合并同类项可得
$$
f(i,j)=f(i-1,j-1)\cdot \frac{i+1}{i}\cdot \frac{j+1}{j}+f(i-1,j)\cdot \frac{i+1}{i}
$$
把超出边界的值都看成 $0$ ,可以发现第 $0$ 列仍然不满足递推式,算一下差的值,不难发现在最左边再补一列 $1,2,3,4,\dots$ 就行了,其中第 $j$ 列的值为 $j+1$ .可以看成从左上角出发,每次向下或向右下走一步.
其中第 $i-1$ 行到第 $i$ 行的贡献是 $\frac{i+1}i$ ,从第 $j-1$ 列到第 $j$ 列的贡献是 $\frac{j+1}{j}$ .
把所有贡献和行走的方案数乘在一起,可以算出 $f(i,j)=\binom{i}{j+1}\cdot (i+1)\cdot (j+1)$ .
要求的是
$$
ans=\sum_{1\le a\le A}\sum_{1\le b\le B}\sum_{1\le c\le C}f(k,(ax^2+bx+c)\bmod k)
$$
尝试对每个 $i$ 算出有几组 $a,b,c$ 满足 $(ax^2+bx+c)\bmod k=i$ .
预处理
$$
f_a(i)=\sum_{1\le a\le A}[ax^2\bmod k=i],\\
f_b(i)=\sum_{1\le b\le B}[bx\bmod k=i],\\
f_c(i)=\sum_{1\le c\le C}[c\bmod k=i].
$$
考虑如何求 $f_a(i)$ ,记 $v=x^2\bmod k$ ,由于 $k$ 是 $2$ 的幂,特判 $v=0$ ,否则将 $v$ 分解成 $v=2^p\cdot t$ ,其中 $t$ 为奇数.
显然每 $\frac k {2^p}$ 个 $a$ 就会将 $0,2^p,2\times 2^p,\dots,(\frac{k}{2^p}-1)\times 2^p$ 遍历,算一下完整循环节个数,多余部分 $O(k)$ 暴力.
$f_b,f_c$ 的预处理同理,都可以在 $O(k)$ 内完成.
然后将 $f_a,f_b,f_c$ 做长度为 $k$ 的循环卷积就能求出每个 $i$ 有几组 $a,b,c$ 满足 $(ax^2+bx+c)\bmod k=i$ 了.
保证了 $k$ 为 $2$ 的幂,且对于模数有 $2\times 10^6\le 2^{21}$ ,只用做 $3$ 次长度为 $k$ 的 DFT ,一次长度为 $k$ 的 IDFT 即可.
时间复杂度 $O(T\cdot k\log k)$ .
1 | //%std |