做题记录 26.2.24

\(\textcolor{black}\odot\) AT_arc147_f [ARC147F] Again ABC String

先转化为以下问题:初始三个值分别等于 \(a,b,c\),每次选择一个加一,一个减一,要求全程三者非负,求操作 \(n\) 次的方案数

建立一个长度为 \(a+b+c+3\) 的环,环上确定正方向,初始三个点距离分别为 \(a+1,b+1,c+1\),每次选择一点向正方向移动 \(1\) 的距离,要求全程三者不能相互重叠,求移动 \(n\) 次的方案数

若过程中某两点重合,且最终没有重合,将两点第一次重合后的部分互换,显然也是一种方案,由于答案 \(\bmod 2\),因此可以忽略这种情况,从而只需要考虑三者最终是否重叠即可

总方案数显然为 \(3^n\)\(\bmod 2\) 后为 \(1\),减去其中两项重合的方案数,此时三项都重合的多算了两次,不影响答案的奇偶性,从而转化为计算其中两项重合的方案数

\(F=(x^{-1}+1+x)^n \bmod (x^m-1)\),则答案为

\[(1+[x^{a+1}]F+[x^{b+1}]F+[x^c+1]F) \bmod 2 \]

\((x^{-1}+1+x)^{2^k}\equiv x^{-2^k}+1+x^{2^k}\pmod 2\),假设对 \(n\) 二进制拆分得到 \(\sum_i 2^{p_i}\),则在 \(\bmod 2\) 意义下可以简化

\[F=\left(\prod_i \left(x^{-2^{p_i}}+1+x^{2^{p_i}}\right)\right)\bmod (x^m-1) \]

对于 \(m\) 较小的情况,暴力卷积可以做到单次 \(O(m)\),总计 \(O(m\log n)\),使用 std::bitset 可以优化到 \(O(m+\frac{m\log n}{\omega})\),手写 bitset 可以做到 \(O(\frac{m\log n}\omega)\)

对于 \(m\) 较大的情况,单独考虑一项 \([x^d]F\),可以转化为

\[\begin{aligned} &\sum_{r\equiv d\pmod m} [x^r]\prod_i \left(x^{-2^{p_i}}+1+x^{2^{p_i}}\right)\\ =&\sum_{r\equiv d+n\pmod m} [x^r]\prod_i \left(1+x^{2^{p_i}}+x^{2^{p_i+1}}\right) \end{aligned} \]

\(O(\frac nm)\) 枚举 \(r\),考虑快速计算一项 \([x^r]\prod_i \left(1+x^{2^{p_i}}+x^{2^{p_i+1}}\right)\),等价于初始为 \(0\),对于每个 \(p_i\) 选择不翻转,或翻转第 \(p_i\) 位,或翻转第 \(p_i+1\) 位,要使得最终值为 \(r\),容易数位 \(dp\) 做到 \(O(\log n)\)

由此得到 \(O(\frac{m\log n}\omega)\)\(O(\frac{n\log n}m)\) 的算法,对于 \(m\) 阈值分治,令阈值为 \(O(\sqrt{n\omega})\) 可以做到 \(O(\frac{\sqrt n\log n}{\sqrt{\omega}})\)

代码

参考

posted @ 2026-02-26 13:53  Hstry  阅读(0)  评论(0)    收藏  举报