CF1066E 题解
CF1066E
题意
给定两个长度分别为 \(l1, l2\) 的二进制数 \(s1, s2\),令答案为 \(ans\)。
当 \(s2 > 0\) 时,\(ans\) 加上 s1 & s2
所表示的十进制的值,之后 \(s2\) 的值减少到原来的一半(向下取整)。
请你求出最终的 \(ans\) (对 998244353 取模)。
思路
因为 \(s1\) 是不会变化的,所以我们可以考虑 \(s1\) 的每一位对于答案的贡献。
令 \(s1_1\) 为 \(s1\) 的最高位,\(s1_2\) 为 \(s1\) 的次高位,以此类推。
因为做的是 \(\&\) 运算,所以如果 \(s1_i\) 为 \(0\),那就不能对答案产生任何贡献。
那么如果 \(s1_i\) 为 \(1\),那么从 \(s2_1 \dots s2_{\max(0, l1 - l2) + i}\) 都会对第 \(i\) 位产生贡献。
所以做法就很明显了,先预处理出 \(s2\) 的前缀和。
对于所有 \(1 \le i \le l1\),如果 \(s1_i\) 为 \(1\),会对答案有贡献,求出贡献,累加。