1 条题解
-
0
一、问题重述
定义 :在二进制字符串 中同时删除所有子串
10,重复直到无10。
是几乎回文当且仅当 。
求长度为 的几乎回文串数量,模 。
二、已知结论(来自 Hint)
设 为前 个字符中
1个数减0个数的值,。
设 ,,则 。
完全由 决定。
几乎回文条件等价于 当 为偶数, 当 为奇数。
三、子问题
定义 为:从 到 的路径数(步长 对应
1, 对应0),恰好触及直线 和 (即 且 ,且等号至少各取一次)。Hint 给出公式:
$$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] $$其中 为偶数(因为每步纵坐标变化 )。
四、转化为对称形式
设 ,,并令:
$$n' = \frac{n - (l+r)}{2}, \quad m' = \frac{n + (l+r)}{2} $$则原路径映射到从 到 的路径,新坐标下边界为 和 的平移。
$$\begin{aligned} &\; f\!\left(n', m', l, r\right) \\ -&\; f\!\left(n', m', l-1, r\right) \\ -&\; f\!\left(n', m', l, r+1\right) \\ +&\; f\!\left(n', m', l-1, r+1\right) \end{aligned} $$
恰好触及上下界的路径数由容斥给出:
五、关键观察(压缩求和)
注意 ,且 。
在 的展开中,二项式上指标始终为 ,与 无关。
下指标为:以及加上 的类似项。
固定 (极差)时, 只有两种可能: 或 (由 奇偶性决定)。
因此对每个 ,只需考虑 和 两种情况,且 ,。
此时下指标随 变化形成等差数列,公差为 (见标程中的 )。
六、标程中的
标程定义 ,其中:
- 对应
- 对应
则 ,。
代入公式后,下指标为:以及加上 的项。
的四个循环分别实现:- 主项 的正部分(区间和)
- 主项中的负修正(单个组合数乘系数 )
- 反射项的正部分(区间和,从 开始)
- 反射项的负修正(单个组合数)
最终 计算出固定 和 下的所有 对应的路径数之和(即所有满足极差 且 的字符串数量)。
七、最终答案的累加
对于每个 ,若 为偶数(否则无合法路径),则:
- 的贡献为
- 的贡献为
标程中的累加方式:
cadd(ans, x); cadd(ans, x = calc(i, 0)); y = calc(i, 1); csub(ans, add(y, y));其中 初始为 。
$$\text{ans} = \sum_{k} \left( \text{count}_{l+r=0} - 2 \cdot \text{count}_{l+r=1} \right) $$
这等价于对每个 ,加上 ,减去 。
这是因为最终答案的公式(从 Hint 4 推导)为:其中 。
八、复杂度分析
对于每个 , 中的循环次数约为 。
求和 。
预处理组合数 。
总复杂度 ,满足 。
九、代码细节对应
a[i]存储 模 ,s[i]为前缀和。ask(l, r)求 。init预处理逆元,用于递推组合数。- 主循环中
for (int i = 1; i <= n; i++)枚举极差 。 if (n + i & 1) continue;确保 与 同奇偶,否则无合法路径。
十、总结
本题通过:
- 将二进制串映射为格路
- 利用反射原理得到恰好触及边界的路径计数公式
- 固定极差 并利用等差数列性质压缩求和
- 预处理组合数及其前缀和实现 查询
最终得到长度为 的几乎回文串数量。标程完全遵循这一推导,代码中的 直接实现了压缩后的求和。
- 1
信息
- ID
- 6449
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者