CF1034E
给两个数列 (a,b),编号为 ([0,2^n))。
计算 (c) 序列为 (a,b) 的子集卷积结果,答案对 (4) 取模。
(nle 21),时限 (1s)
Solution
神题。真的巧妙,完全想不到。
先定义 (cnt_i= extrm{popcount}(i))
注意到 (4^{21}) 远小于 long long
,于是这个题我们这样做:
构造序列 (a'_i=a_i imes 4^{cnt_i}),(b_i'=b_i imes 4^{cnt_i})。
考虑 (c_i'=sum_{j|k=i}a_j' imes b_k')
令 (c_i=frac{c_i'}{4^{cnt_i}}mod 4)。
原理:
-
注意到若 (cnt_i+cnt_j>cnt_{i|j}),那么贡献为 (k imes 4),即 (0)
-
否则如果 (cnt_i+cnt_j=cnt_{i|j}),那么贡献为 (a_i imes b_j)