1 条题解
-
0
一、问题重述
定义 :在二进制字符串 中同时删除所有子串
10,重复直到无10。
是几乎回文当且仅当 。
求长度为 的几乎回文串数量,模 。Hard 版本数据范围:,所有 之和 。
二、已知结论(来自 E1 和 Hint)
设 为前 个字符中
1个数减0个数的值,。
设 ,,则 。
完全由 决定。
几乎回文条件等价于 当 为偶数, 当 为奇数。
三、子问题回顾
定义 为:从 到 的路径数(步长 对应
$$f(n, m, l, r) = \sum_{k \in \mathbb{Z}} \left[ \binom{n+m}{n - k(r-l)} - \binom{n+m}{n - k(r-l) + r} \right] $$1, 对应0),恰好触及直线 和 。
Hint 给出公式:且 为偶数。
四、Hard 版本的加速思路
E1 中通过枚举极差 并利用等差数列求和,得到 解法。
Hard 版本需要 预处理 + 或 单次查询。关键观察:对每个固定的 ,最终答案可以写成组合数 的线性组合,系数只与 的某个数论函数有关。
五、推导最终公式(基于 Hint)
考虑所有满足 ( 偶)或 ( 奇)且极差 的路径之和。
经过复杂的反射求和与交换求和次序,Hint 给出:对于蓝色部分(即 的某种求和),其系数最终化简为:
$$\sum_{l} \sum_{z} \binom{n}{\frac{n - (2z-1)k}{2} - l} \quad \Rightarrow \quad \text{系数为 } g(|n-2m|) $$其中 定义为:
即 的所有满足 为奇数的因子 之和。
六、最终封闭形式
将所有部分(主项、反射项、容斥项)求和后,得到长度为 的几乎回文串数量为:
$$\text{ans}(n) = (-1)^{n+1} \cdot 2^n + 2 \sum_{i=0}^{n} \binom{n}{i} \big( g(|n-2i-1|) - g(|n-2i|) \big) $$其中 需单独定义:。
七、进一步简化(标程实现形式)
标程中实际计算的是:
具体地:
$$\text{ans} = 2 \sum_{i=0}^{n} \binom{n}{i} \big( f(|n-2i-1|) - f(|n-2i|) \big) + \begin{cases} +2^n & n\text{ 偶} \\ -2^n & n\text{ 奇} \end{cases} $$其中 。
并且标程将组合数 用阶乘和逆元表示,即:
八、数论函数 的线性筛预处理
定义 。
等价地,若 ( 为奇数),则:因为 跑遍 的所有因子乘以 (),但条件 为奇数要求 必须包含全部 ,即 且 。
所以 。标程中的
f[i]实际存储的是 ,g[i]是辅助数组用于筛法。筛法原理:
- 对质数 :,即 时 , 时 (因为因子 和 ,且 为奇数, 为奇数,所以 )。
- 线性筛时,若 ,则 的 值由 递推得到。
九、标程代码对应
-
预处理(
init函数):- 线性筛计算 对 。
- 预处理阶乘
fac和逆元ifac。
-
主循环:
for (int i = 0; i <= n; i++) { ans = (ans + (ll)ifac[i] * ifac[n - i] % mod * sub(f[abs(n - i * 2 - 1)], f[abs(n - i * 2)])) % mod; } ans = (ll)ans * fac[n] % mod; cadd(ans, ans); (n & 1 ? cadd : csub)(ans, qpow(2, n));ifac[i] * ifac[n-i]乘以fac[n]最后乘,等价于 。sub(f[abs(...)], f[abs(...)])计算 。- 最后乘以 并加上/减去 对应公式中的 。
十、复杂度分析
- 线性筛:
- 每个测试用例: 求和
- 所有 之和 ,故总复杂度 ,可接受。
十一、总结
Hard 版本通过:
- 将问题转化为数论求和
- 发现系数为
- 利用线性筛 预处理
- 最终 回答每个询问
实现了 总复杂度的解法,完美适配 且总 和 的限制。
- 1
信息
- ID
- 6450
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者