1 条题解
-
0
题意回顾
对于一个二进制字符串 ,定义
并且 若 。
定义 $\text{score}(v) = \max\limits_{0 \le i \le |v|} \big[ F(v,1,i) \times F(v,i+1,|v|) \big]$。
给定一个长度为 的二进制字符串 ,有 次修改(每次翻转某一位),每次修改后要求所有非空子序列的得分之和,对 取模。
第一步:简化得分公式
对于子序列 ,设其有 个 、 个 ,总长度 。
考虑 的一个前缀,设其中有 个 、 个 ,则:
对应的后缀有 个 、 个 ,则:
记 ,则得分 = 。
这是一个关于 的二次函数 ,其中 。
它在 处取得最大值 ,由于 必须是整数且可达,实际最大值为:
$$\text{score}(v) = \left\lfloor \frac{\Delta^2}{4} \right\rfloor $$其中 。
第二步:转化为组合计数
设原串中 的总数为 , 的总数为 ()。
一个子序列由选择若干个 和若干个 组成(位置决定子序列的唯一性)。
对于给定的 ,这样的子序列个数为 。因此,所有非空子序列的得分之和为:
$$\text{ans} = \sum_{o=0}^{O} \sum_{z=0}^{Z} \binom{O}{o} \binom{Z}{z} \cdot \left\lfloor \frac{(o-z)^2}{4} \right\rfloor $$其中 ,但 时 ,贡献为 ,所以包含在内无影响。
第三步:按 分组
令 ,则 。
固定 , 的范围:。
此时:
$$\text{cnt}[d] = \sum_{z=\max(0,-d)}^{\min(Z, O-d)} \binom{O}{z+d} \binom{Z}{z} $$于是:
$$\text{ans} = \sum_{d=-Z}^{O} \text{cnt}[d] \cdot \left\lfloor \frac{d^2}{4} \right\rfloor $$
第四步:简化
考虑生成函数:
$$\sum_{d} \text{cnt}[d] x^d = \sum_{z} \sum_{o} \binom{O}{o} \binom{Z}{z} x^{o-z} $$$$= \left( \sum_{o} \binom{O}{o} x^o \right) \left( \sum_{z} \binom{Z}{z} x^{-z} \right) $$因此, 是 中 的系数,即:
第五步:代入得简洁公式
令 ,则 从 到 ,。
于是:
$$\text{ans} = \sum_{k=0}^{n} \binom{n}{k} \cdot \left\lfloor \frac{(k-Z)^2}{4} \right\rfloor $$其中 是当前字符串中 的个数。
第六步:模运算处理
$\lfloor (k-Z)^2 / 4 \rfloor = \frac{(k-Z)^2 - r(k)}{4}$,其中 。
所以:
$$\text{ans} = \frac{1}{4} \left[ \sum_{k=0}^{n} \binom{n}{k} (k-Z)^2 - \sum_{k=0}^{n} \binom{n}{k} r(k) \right] $$
第一部分:
利用公式:
$$\sum_{k=0}^{n} \binom{n}{k} k^2 = n(n-1) 2^{n-2} + n 2^{n-1} $$所以:
$$\sum_{k=0}^{n} \binom{n}{k} (k-Z)^2 = \left[ n(n-1)2^{n-2} + n2^{n-1} \right] - 2Z \cdot n2^{n-1} + Z^2 \cdot 2^n $$
第二部分:
,只依赖于 。
设 ,则 $r(k) = t^2 \bmod 4 = \begin{cases} 0, & t \text{ 偶} \\ 1, & t \text{ 奇} \end{cases}$
所以 当且仅当 或 。
因此:
$$\sum_{k=0}^{n} \binom{n}{k} r(k) = \sum_{k \equiv Z+1 \pmod{4}} \binom{n}{k} + \sum_{k \equiv Z+3 \pmod{4}} \binom{n}{k} $$
如何计算 模
利用单位根 (模 下存在,因为 )。
公式:
$$\sum_{k \equiv a \pmod{4}} \binom{n}{k} = \frac{1}{4} \sum_{j=0}^{3} \omega^{-ja} (1+\omega^j)^n $$其中 (原根 的 次幂),满足 。
第七步:动态维护
每次翻转一位, 变化 , 也随之变化。
但注意公式中只依赖 ,因为 固定。所以每次修改后:
- 更新 ( 的个数)
- 用上面公式计算新的
计算复杂度 每次修改(因为单位根求和是固定的 项)。
第八步:最终算法
预处理:
- (模 )
- 单位根 及其幂次
- 初始
每次修改:
- 更新
- 计算:
输出 。
时间复杂度
预处理 ,每次修改 ,总复杂度 每个测试用例,满足要求。
- 1
信息
- ID
- 6358
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者