有一个控制面板,上面有 K 个灯泡排成一排。每个灯泡有两种状态:亮(用 `1` 表示)或灭(用 `0` 表示)。面板的初始状态由一个长度为 K 的 0/1 字符串 S 给出。
有 N 种操作,编号为 1 到 N。每种操作必须执行一次,且只能执行一次。这 N 种操作会在 N 天内全部执行完毕,但每天执行哪种操作的顺序已经丢失了。
对于第 i 种操作,题目给出三个长度为 K 的 0/1 字符串 A_i, B_i, X_i:
- **执行条件**:在执行操作 i 之前,面板必须满足:
- 对于所有 j,如果 A_i 的第 j 位是 `1`,则第 j 个灯泡必须亮着;
- 对于所有 j,如果 B_i 的第 j 位是 `1`,则第 j 个灯泡必须灭着。
- (如果 A_i 和 B_i 在同一位都是 `1`,则这个操作永远无法执行。)
- **执行效果**:执行操作 i 时,对于所有 j,如果 X_i 的第 j 位是 `1`,则翻转第 j 个灯泡的状态(亮变灭,灭变亮)。
小 Z 记录了每天操作**之后**亮着的灯泡数量。设第 t 天操作后的亮灯数为 C_t,则他得到了一个长度为 N 的序列 C_1, C_2, \ldots, C_N。
这份记录会接受 Q 次**订正**。第 q 次订正给出两个整数 T_q, Y_q,表示把**当前记录**中第 T_q 天的值改为 Y_q。
**注意:订正是累积的。** 即第 q 次订正是在前 q-1 次订正都已经生效的基础上进行的,而不是每次从最初的记录重新修改。
每次订正之后,你需要回答:有多少种操作执行顺序,能够产生**当前**的记录序列 C?
这里,“操作执行顺序”指的是 (1, 2, \ldots, N) 的一个排列 (p_1, p_2, \ldots, p_N),表示第 1 天执行操作 p_1,第 2 天执行操作 p_2,……,第 N 天执行操作 p_N
一个排列与当前记录 C 相容,当且仅当:
- 从初始状态 S 开始;
- 第 t 天执行操作 p_t 前,面板状态满足操作 p_t 的执行条件;
- 第 t 天执行操作 p_t 后,亮灯数恰好等于 C_t(对于所有 1 \le t \le N)。
答案对 998244353 取模。
**注意**:即使两个操作的条件和效果完全相同,只要它们的编号不同,交换它们也视为不同的执行顺序。
- 第 1 行三个整数 N, K, Q;
- 第 2 行一个长度为 K 的 0/1 字符串 S,表示初始状态;
- 第 3 行 N 个整数 C_1, C_2, \ldots, C_N,表示初始记录;
- 接下来 N 行,第 i 行三个长度为 K 的 0/1 字符串 A_i, B_i, X_i,描述第 i 种操作;
- 接下来 Q 行,每行两个整数 T_q, Y_q,表示一次订正。
输出 Q 行,每行一个整数,表示每次订正后的合法顺序数(对 998244353 取模)。
3 3 4 010 2 1 2 010 000 100 100 000 001 000 001 010 2 3 2 1 1 0 1 2
0 1 0 1
6 5 8 10100 3 2 3 4 3 2 10000 00010 01001 00100 00000 10010 00000 01000 00101 01001 10000 00011 00010 00100 11000 00000 00001 01110 3 4 6 1 1 2 4 5 5 0 2 3 3 2 6 2
0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 1 1 1
1
- 1 \le N \le 9
- 1 \le K \le 9
- 1 \le Q \le 10^5
- S, A_i, B_i, X_i 均为长度 K 的 0/1 字符串
- 0 \le C_t \le K
- 1 \le T_q \le N,0 \le Y_q \le K
| 时间限制 | 1 秒 |
| 内存限制 | 128 MB |