题目描述
下図のように,1 辺が N 個の点からなる正三角形状に,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,\ X_{i,1}),\ (2,\ X_{i,2}),\ ...,\ (N,\ X_{i,N}) $ をこの順で結んでいる.
- j=1, 2, ..., N−1 に対して,Xi,j+1 = Xi,j または Xi,j+1 = Xi,j+1 が成り立つ.
高橋君は,折れ線 i+1 が折れ線 i の左に来ることはないように折れ線を描きたいです. つまり,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 個の折れ線を描く方法が何通りあるかを mod 1000000007 で求めてください.
输入格式
入力は以下の形式で標準入力から与えられる。
N M K A1 B1 C1 A2 B2 C2 : AK BK CK
输出格式
高橋君が M 個の折れ線を描く方法は何通りあるかを mod 1000000007 で出力せよ.
题目大意
- 给定一个 N 层的三角形图,第 i 层有 i 个节点。
- 第 i 层的节点,从左到右依次标号为 (i,1),(i,2),…,(i,i)(具体如上图所示)。
- 你需要从 (1,1) 往下画 M 条折线。
- 对于每条折线的每一个小段,你可以从 (i,j) 画到 (i+1,j) 或者 (i+1,j+1)。
- 同时你还必须保证第 i 条折线的任何一个位置必须不能处在第 i−1 条折线的左侧,它们必须按照从左到右的顺序排列。
- 有 K 条限制,每条限制形如 (Ai,Bi,Ci)。
- 表示第 Ai 条折线处于位置 (Bi,j) 时,下一小段必须走向 (Bi+1,j+Ci),也就是当 Ci=0 时向左,当 Ci=1 时向右。
- 询问不同的折线画法的方案数,对 109+7 取模。
- 1≤N,M≤20,0≤K≤M(N−1)。其它变量在合理范围内。
3 2 1
1 2 0
6
3 2 2
1 1 1
2 1 0
0
5 4 2
1 3 1
4 2 0
172
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) として同じ組は複数回与えられない.
Sample Explanation 1
下図に示すように,6 通りの描き方があります.ただし,赤線は折れ線 1,緑線は折れ線 2 を表します: ![](https://atcoder.jp/img/agc017/75921b6e5a59ab17b4c07ada848b9f14.png)