垃圾脑瘫的坑
该题解为残缺品,笔者自己也不是很懂
CF1327F AND Segments题解
题目描述
你有三个整数 \(n, k, m\) 以及 \(m\) 个限制 \((l_1, r_1, x_1), (l_2, r_2, x_2), \ldots, (l_m, r_m, x_m)\)。
计算满足下列条件的,长度为 \(n\) 的序列 \(a\) 的个数:
-
对于每个 \(1 \le i \le n\),\(0 \le a_i \lt 2 ^ k\)。
-
对于每个 \(1 \le i \le m\),数字的按位与 \(a[l_i] \text{ and } a_[l_i + 1] \text{ and } \ldots \text{ and } a[r_i] = x_i\)。
两个序列 \(a, b\) 被认为是不同的,当且仅当存在一个位置 \(i\) 满足 \(a_i \neq b_i\)。 由于答案可能过大,请输出其对 \(998\ 244\ 353\) 取模的结果。
解题思路
CF1327F AND Segments题解
题目描述
你有三个整数 \(n, k, m\) 以及 \(m\) 个限制 \((l_1, r_1, x_1), (l_2, r_2, x_2), \ldots, (l_m, r_m, x_m)\)。
计算满足下列条件的,长度为 \(n\) 的序列 \(a\) 的个数:
-
对于每个 \(1 \le i \le n\),\(0 \le a_i \lt 2 ^ k\)。
-
对于每个 \(1 \le i \le m\),数字的按位与 \(a[l_i] \text{ and } a_[l_i + 1] \text{ and } \ldots \text{ and } a[r_i] = x_i\)。
两个序列 \(a, b\) 被认为是不同的,当且仅当存在一个位置 \(i\) 满足 \(a_i \neq b_i\)。 由于答案可能过大,请输出其对 \(998\ 244\ 353\) 取模的结果。
解题思路
对于每一位,我们可以分开考虑。
假设考虑到第\(a\)位。
对于每段区间,若\(x_i\)对应的位为\(1\),那么整段区间这位对应的数都是\(1\),用差分数组维护
对于\(x_i\)为\(0\)的区间,考虑用DP求解方案数。
为转移方便,我们维护一个\(pos_i\)表示\(i\)之前的第一个0至少填在\(pos_i\)这个位置,可以参考代码理解
设\(f_{i,j}\)表示从低到高位填到第\(i\)位,最后一个0的位置为\(j\)时的方案数,分三种情况转移
- \(j<pos_i\),则\(f_{i,j}=0\),这种情况不可能
- \(pos_i\leq j \leq i-1\),则\(f_{i,j}=f_{i-1,j}\),因为\(i\)这里没有决策,只能填\(1\)
- \(i=j\),则\(f_{i,i}=\sum_{x=pos[i-1]}^{i-1}f_{i-1,x}\)