【题解】P3689 [ZJOI2017] 多项式
https://www.luogu.com.cn/problem/P3689
和 sst 大神一起刷题!
\(f^2(x)=f(x^2)\),故对 \(m\) 二进制分解后 \(f^m(x)=\prod_{m_i=1} f(x^{2^i})\)。
考虑求 \([x^n]f^m(x)\),可以使用数位 dp:\(F_{i,j/2}=[j\bmod 2=n_i]\begin{cases}\sum_{[x^k]f(x)=1} F_{i-1,j-k} & m_i=1\\ F_{i-1,j} & m_i=0 \end{cases}\),在 mod 2 意义下进行。
这样 \(j\le \deg f\),可以使用状压压缩 dp 数组,建立自动机,每个点有 \(4\) 条出边。那么自动机最终到达的节点 \(u\),其奇偶性即代表了 \([x^n]f^m(x)\)。
先把 DFA 变成从高位往低位做的,然后把询问差分变成 \(< r\) 有几个 \(t\)。
按照数位 dp 的思路,计数 \([x,x+2^i)\) 这个区间内的 \(t\) 的数量,而跨过区间可以通过手动计算区间前 \(|t|\) 个和后 \(|t|\) 个位置,然后暴力 check。
设 \(G_{i,u}\) 表示当前考虑第 \(i\) 位,自动机节点是 \(u\),得到的字符串是什么。
那么有 \(G_{i,u}=G_{i-1,\mathtt{Trans}(u,0,m_i)}+G_{i-1,\mathtt{Trans}(u,1,m_i)}\),可以通过倍增处理。记得同时维护 \(pre_{i,u}\) 和 \(suf_{i,u}\) 表示前后缀 \(|t|\) 个字符是什么。
时间复杂度 \(O(2^n\log^2 r)\)。
浙公网安备 33010602011771号