题目描述
Alice 和 Bob 在玩一个游戏。
初始地,有一个长度为 n 的 01 序列,位置编号为 1,2,…,n。双方轮流操作,Alice 先操作。
Alice 的操作是任意选择序列中位置相邻的两个数,将它们合并为它们的异或值(即 C++ 中的 ^ 操作)。
Bob 的操作是任意选择序列中位置相邻的两个数,将它们合并为它们的与值(即 C++ 中的 & 操作)。
游戏将持续进行,直至序列中仅剩一个数。如果最后剩下的数是 1,Alice 获胜;否则,Bob 获胜。
在游戏开始前,Bob 施展了 m 次魔法调整初始序列,第 i 次魔法将第 ai 个位置的数改为 vi。
Alice 想知道,如果双方都使用最优策略,有多少种可能的初始序列(在 Bob 施展魔法之前)能够让她赢得游戏。由于答案可能非常大,你需要将结果对质数 109+7 取模。
输入格式
本题有多组测试数据。
第一行,一个正整数 T,表示数据组数。接下来,对于每组数据:
- 第一行,两个非负整数 n,m,分别表示 01 序列的长度和 Bob 的魔法操作次数。
- 接下来 m 行,第 i 行两个非负整数 ai,vi,表示第 i 次魔法操作将第 ai 个位置的数改为 vi。保证 ai 严格递增给出,即 1≤a1<a2<⋯<am≤n。
输出格式
对于每组测试数据:
- 仅一行,一个整数,表示答案对 109+7 取模后的结果。
样例
5
3 0
5 2
2 0
4 1
6 3
1 0
2 1
4 1
1234 4
52 1
110 1
520 0
999 1
114514 0
3
12
32
27109943
596672839
样例 1 解释
第一组数据中,可以让 Alice 赢的序列有 110、101、011 共 3 种。
第二组数据中,可以让 Alice 赢的序列有 10100、11100、10110、11110、10001、11001、00101、01101、10011、11011、00111、01111 共 12 种。
其中序列 11100,在 Bob 实施完魔法后变成了 10110。Alice 第一次操作可以合并第四个数和第五个数,序列变成 1011,可以发现 Bob 无论怎么操作 Alice 都会赢。
样例 2
见附件中的 game/game2.in 与 game/game2.ans。
该组样例满足测试点 5∼6 的约束条件。
样例 3
见附件中的 game/game3.in 与 game/game3.ans。
该组样例满足测试点 10∼11 的约束条件。
样例 4
见附件中的 game/game4.in 与 game/game4.ans。
该组样例满足测试点 12∼13 的约束条件。
样例 5
见附件中的 game/game5.in 与 game/game5.ans。
该组样例满足测试点 18∼20 的约束条件。
数据范围
对于所有测试数据,保证:1≤T≤5×105,1≤n≤1015,0≤m≤n,∑m≤5×105,1≤ai≤n,ai<ai+1,vi∈{0,1}。
| 测试点编号 |
T≤ |
n≤ |
∑m≤ |
特殊性质 |
| 1 |
40 |
20 |
40 |
无 |
| 2∼4 |
103 |
5×102 |
5×105 |
A |
| 5∼6 |
B |
| 7∼9 |
C |
| 10∼11 |
2×105 |
106 |
0 |
无 |
| 12∼13 |
2×105 |
| 14 |
2×103 |
1015 |
0 |
| 15∼16 |
2×103 |
| 17 |
5×105 |
0 |
| 18∼20 |
5×105 |
- 特殊性质 A:n=m。
- 特殊性质 B:n=m,且 vi=1。
- 特殊性质 C:n=m,且 v 中没有相邻的两个 0,即 vi+vi+1=0。
下发文件
通过点击此链接下载下发文件。