分析
令 dp[ i ][ s ][ j ][ k ] 为进行了 i 次操作,当前数的二进制表示中后 8 位为 s ,第 9 位为 0 或 1,并且从第 9 位开始有连续 j 位相同的概率。转移挺麻烦的但是很显然,这里就不写了
(写在代码里了QwQ)。
直接贴题解
解释一下取后 8 位的原因。考虑对一个这样的数进行 +1 操作:……11011111111,我们将第 9 位的 0 进成 1 时,前面有多少个连续的 1 是未知的,如果之后再产生一次进位,这些未知个数的 1 都会变成 0,而它们都会对答案产生贡献,由于个数未知,无法将这些贡献计入答案。而取后 8 位时,最少需要 2^8 次 +1 操作才会产生第二次进位,而操作总数最多只有 200,因此进位次数最多 1,不会对答案产生影响。
时间复杂度O(2^8*n^2) 。
#include<bits/stdc++.h>
#define MaxM 232//(2^31-1)*2^200//所以连续的有232-8但是可能越界,于是开的稍微大一点
#de