Loading

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\),会对答案有贡献,求出贡献,累加。

posted @ 2023-03-12 23:25  chengning0909  阅读(16)  评论(0编辑  收藏  举报