题目描述
如上图所示,有 N 个点构成边长为 1 的正三角形,每个点都排列成正三角形的形状,总共有 N(N+1)/2 个点。我们用 (i, j) 表示从上往下第 i 行、从左往右第 j 个点(1≤i≤N,1≤j≤i)。另外,(i+1, j) 是 (i, j) 的正左下方的点,(i+1, j+1) 是 (i, j) 的正右下方的点。

高桥君打算在这些点之间画 M 条折线 1,2,…,M。每条折线都从 (1,1) 出发,随后「每次选择当前位置的正左下方或正右下方的点,用直线连接到那个点并移动过去」,重复 N−1 次。因此,存在某些 Xi,1,…,Xi,N 满足以下条件:
- 折线 i 依次连接 N 个点 (1, Xi,1), (2, Xi,2),…,(N, Xi,N)。
- 对于 j=1,2,…,N−1,有 Xi,j+1=Xi,j 或 Xi,j+1=Xi,j+1。
高桥君希望画图时,编号大的折线不会位于编号小的折线左边。也就是说,对于 j=1,2,…,N,有 X1,j≤X2,j≤…≤XM,j。
此外,高桥君还需要满足关于曲线拐弯的 K 个条件。第 i 个条件 (Ai, Bi, Ci) 的意义如下:
- 当 Ci=0 时,画折线 Ai 时,在第 Bi 次移动时,必须选择左下方的点。
- 当 Ci=1 时,画折线 Ai 时,在第 Bi 次移动时,必须选择右下方的点。
换句话说,XAi,Bi+1=XAi,Bi+Ci。
请计算,高桥君能画出不同的 M 条折线的方案数,对 1000000007 取模后输出。
输入格式
输入从标准输入读入,格式如下:
N M K A1 B1 C1 A2 B2 C2 … AK BK CK
输出格式
输出高桥君画 M 条折线的方案数,对 1000000007 取模。
样例 1
输入
3 2 1
1 2 0
输出
6
样例 2
输入
3 2 2
1 1 1
2 1 0
输出
0
样例 3
输入
5 4 2
1 3 1
4 2 0
输出
172
样例 4
输入
20 20 0
输出
881396682
说明/提示
注意
提交前,强烈建议使用“代码测试”测量运行时间。
限制
- 1≤N≤20
- 1≤M≤20
- 0≤K≤(N−1)M
- 1≤Ai≤M
- 1≤Bi≤N−1
- Ci=0,1
- (Ai,Bi) 作为同一组不会重复出现多次。
样例解释 1
如图所示,共有 6 种画法。红线表示折线 1,绿色表示折线 2。
由 ChatGPT 5 翻译