做题记录 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)\),则答案为
而 \((x^{-1}+1+x)^{2^k}\equiv x^{-2^k}+1+x^{2^k}\pmod 2\),假设对 \(n\) 二进制拆分得到 \(\sum_i 2^{p_i}\),则在 \(\bmod 2\) 意义下可以简化
对于 \(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\),可以转化为
\(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}})\)

浙公网安备 33010602011771号