CF1034E

CF1034E

给两个数列 \(a,b\),编号为 \([0,2^n)\)

计算 \(c\) 序列为 \(a,b\) 的子集卷积结果,答案对 \(4\) 取模。

\(n\le 21\),时限 \(1s\)

Solution

神题。真的巧妙,完全想不到。

先定义 \(cnt_i=\textrm{popcount}(i)\)

注意到 \(4^{21}\) 远小于 long long,于是这个题我们这样做:

构造序列 \(a'_i=a_i\times 4^{cnt_i}\)\(b_i'=b_i\times 4^{cnt_i}\)

考虑 \(c_i'=\sum_{j|k=i}a_j'\times b_k'\)

\(c_i=\frac{c_i'}{4^{cnt_i}}\mod 4\)

原理:

  • 注意到若 \(cnt_i+cnt_j>cnt_{i|j}\),那么贡献为 \(k\times 4\),即 \(0\)

  • 否则如果 \(cnt_i+cnt_j=cnt_{i|j}\),那么贡献为 \(a_i\times b_j\)

posted @ 2020-09-10 19:44  Soulist  阅读(139)  评论(0)    收藏  举报