2023 牛客多校 8 E

神仙题。

题意

计数长度为 \(n\),满足以下条件的序列 \(a\) 个数 \(\bmod 998244353\)

  • \(L\le a_i\le R\)
  • \(S_1(\sum a_i)\equiv S_2(\sum a_i)\pmod m\)。其中 \(S_1(x)\) 表示 \(x\) 的各个数位的和,\(S_2(x)\) 表示各个数位平方和(十进制下)。

数据范围:\(1\le n, m\le 20, 1\le L\le R\le10^{1000}\)

做法

肯定是数位 DP,考虑如何处理上下界限制。容易发现我们只关心总和,所以用容斥处理一下:首先将每个数都减掉 \(L\),上界换为 \(R - L\),并求出 \(nL\) 的十进制表示,数位 DP 过程中加上即可;枚举 \(up\),钦定某 \(up\) 个数大于 \(R - L\),那么只需要求出 \(up\times(R-L + 1)\) 的十进制表示加到总和里即可。这样不再需要总和的限制。注意为了让结果有限大我们还需要限制总和的上界,直接取成 \(10^{1005}-1\),这样 DP 到第 \(1004\) 位的时候停下来即可。

接下来考虑具体的 DP:\(f[i, c, d]\) 表示 \(0\sim i-1\) 位进上来 \(c\),这些位的 \(S_1 - S_2 \equiv d \pmod m\),转移枚举这一位的和 \(t\)

\[\begin{aligned} &g_t\times f[i, c, d]\to f[i + 1, (c + t + B_i) / 10, D]\\ &D = (d + ((c + t + B_i)\bmod 10)^2 - ((c + t + B_i) \bmod 10)) \bmod m \end{aligned} \]

其中 \(g_t\) 表示 \(n\)\(0\sim9\) 的数和为 \(t\) 的方案数,容易预处理得到。转移复杂度 \(10n^2m\lg R\),再加上容斥的一个 \(n\),无法通过。

接下来为了优化,我们先把转移倒过来写成填表形式。接下来注意到转移的一些项是以 \(10\) 为周期的,另一些则每 \(10\) 次才会变化一次,这暗示我们基于这个可以有一些类似预处理求和的优化方法。所以首先将 \(t\) 写成 \(10x + y\) 的形式:

\[f[i, c, d]\gets g_{10x + y}\times f[i + 1, (c + y + B_i) / 10 + x, D] \]

注意到 \((c+y+B_i)/10\) 随着 \(c\) 的变化只有 \(n/10\) 种有用的数值,而 \(D\) 可以直接 \(\Theta(m)\) 枚举,这样我们完全不需要枚举 \(c\) 了,可以转而枚举 \((c + y + B_i) / 10\);而 \(x\) 既不影响其它维度的范围,也不影响转移到的目标,可以被压缩掉。具体地,记 \(h[i, y, p, D] = \sum_{x = 0}^{\lfloor\frac{9n}{10}\rfloor} g_{10x + y}\times f[i + 1, p, D]\),则 \(f[i, c, d]\) 转移时只要枚举 \(y\),复杂度只有 \(10nm\lg R\);预处理 \(h\) 复杂度则是 \(n^2m\lg R\)。总之就是很快。

posted @ 2023-12-07 13:21  kyEEcccccc  阅读(21)  评论(0编辑  收藏  举报