#1370. 「NOI2022」移除石子 (Removing Stones)

「NOI2022」移除石子 (Removing Stones)

题目描述

你正在玩一个名为「移除石子」的小游戏。

nn 堆石子排成一行,第 ii 堆有 aia_i 枚,你的任务是通过如下的操作将所有石子移除:

  • 操作一:选择一堆石子,将其中的至少 22 枚石子移除;
  • 操作二:选择一个连续的编号区间 [l,r][l, r]1lrn1 \le l \le r \le n)并满足 rl2r - l \ge 2,将其中的每一堆石子都恰好移除 11 枚。

你可以采用任意顺序执行任意多次上述两种操作,直到无法再执行操作为止。若最后你能将所有石子全部移除则胜利。

你或许已经开始计算起了诸如「有多少种本质不同的操作方式」的问题,但实际玩起来你却发现自己总是在输。因此,你打算玩个小花招:在游戏开始时,你在手里偷偷藏有 kk 枚石子,在执行所有操作之前你可以且必须将这些石子放入某一堆或某几堆石子中。你期望这会提高自己的胜率,但也清楚这可能会使自己输掉原本可能胜利的游戏。

现在,你可以自由选择一个初始局面进行游戏,具体而言,每个 aia_i 可以选择 [li,ri][l_i, r_i] 范围内的任意整数。你希望计算出,在多少种初始局面下,自己存在至少一种获胜的方案。由于答案很大,你只需要输出其对 (109+7)({10}^9 + 7) 取模的结果。两个初始局面不同,当且仅当存在至少一个 1in\boldsymbol{1 \le i \le n} 使得两者的 ai\boldsymbol{a_i} 不相等,注意这里的“初始局面”指的是你放入 k\boldsymbol{k} 枚石子之前的局面。

输入格式

从文件 stone.in 中读入数据。

本题有多组测试数据。

第一行一个正整数 TT 表示测试数据组数,接下来依次给出每组测试数据。

对于每组测试数据,第一行两个整数 n,kn, k,分别表示石子堆数和加入的石子个数,接下来 nn 行,每行两个非负整数 li,ril_i, r_i 表示每堆石子初始石子数的范围。

输出格式

输出到文件 stone.out 中。

对于每组数据输出一行一个整数,表示可能获胜的局面数对 (109+7)({10}^9 + 7) 取模的结果。

1
4 1
0 1
0 1
0 1
0 1
14

样例 2

见附件中的 [stone2.in](file://stone2.in) 与 [stone2.ans](file://stone2.ans)。

样例 3

见附件中的 [stone3.in](file://stone3.in) 与 [stone3.ans](file://stone3.ans)。

样例 4

见附件中的 [stone4.in](file://stone4.in) 与 [stone4.ans](file://stone4.ans)。

数据范围与提示

对于 100%100 \% 的数据,保证 T10T \le 103n10003 \le n \le 10000liri1090 \le l_i \le r_i \le {10}^90k1000 \le k \le 100

测试点编号 nn \le kk \le 特殊条件
131 \sim 3 55 22 ri5r_i \le 5
454 \sim 5 10001000 00 li=ril_i = r_i
686 \sim 8 100100
9119 \sim 11 00
121312 \sim 13 22
141514 \sim 15 100100 ri10r_i \le 10
162016 \sim 20