[AGC017F] Zigzag

题意翻译

- 给定一个 $N$ 层的三角形图,第 $i$ 层有 $i$ 个节点。 - 第 $i$ 层的节点,从左到右依次标号为 $(i, 1), (i, 2), \ldots , (i, i)$(具体如上图所示)。 - 你需要从 $(1, 1)$ 往下画 $M$ 条折线。 - 对于每条折线的每一个小段,你可以从 $(i, j)$ 画到 $(i + 1, j)$ 或者 $(i + 1, j + 1)$。 - 同时你还必须保证第 $i$ 条折线的任何一个位置必须不能处在第 $i - 1$ 条折线的左侧,它们必须按照从左到右的顺序排列。 - 有 $K$ 条限制,每条限制形如 $(A_i, B_i, C_i)$。 - 表示第 $A_i$ 条折线处于位置 $(B_i, j)$ 时,下一小段必须走向 $(B_i + 1, j + C_i)$,也就是当 $C_i = 0$ 时向左,当 $C_i = 1$ 时向右。 - 询问不同的折线画法的方案数,对 ${10}^9 + 7$ 取模。 - $1 \le N, M \le 20$,$0 \le K \le M (N - 1)$。其它变量在合理范围内。

题目描述

[problemUrl]: https://atcoder.jp/contests/agc017/tasks/agc017_f 下図のように,$ 1 $ 辺が $ N $ 個の点からなる正三角形状に,$ N(N+1)/2 $ 個の点が並んでいます. 上から $ i $ 段目の左から $ j $ 番目の点を $ (i,\ j) $ で表すことにします($ 1\ \leq\ i\ \leq\ N $, $ 1\ \leq\ j\ \leq\ i $). また,$ (i+1,\ j) $ を $ (i,\ j) $ のすぐ左下の点,$ (i+1,\ j+1) $ を $ (i,\ j) $ のすぐ右下の点と呼ぶことにします. ![](https://cdn.luogu.com.cn/upload/vjudge_pic/AT_agc017_f/5db61944d074543e7a00348b55f3a5b5e0696735.png) 高橋君は,この点を結んで,$ M $ 個の折れ線 $ 1,\ 2,\ ...,\ M $ を描くことにしました. 各折れ線は,$ (1,\ 1) $ から始めて,「現在いる点のすぐ左下の点かすぐ右下の点を選び,現在いる点と選んだ点を直線で結んだのち,選んだ点へ移動する」 ことを $ N-1 $ 回繰り返すことで得られます. すなわち,ある $ X_{i,1},\ ...,\ X_{i,N} $ が存在して,次が成り立ちます: - 折れ線 $ i $ は,$ N $ 個の点 $ (1,\ X_{i,1}),\ (2,\ X_{i,2}),\ ...,\ (N,\ X_{i,N}) $ をこの順で結んでいる. - $ j=1,\ 2,\ ...,\ N-1 $ に対して,$ X_{i,j+1}\ =\ X_{i,j} $ または $ X_{i,j+1}\ =\ X_{i,j}+1 $ が成り立つ. 高橋君は,折れ線 $ i+1 $ が折れ線 $ i $ の左に来ることはないように折れ線を描きたいです. つまり,$ j=1,\ 2,\ ...,\ N $ に対して,$ X_{1,j}\ \leq\ X_{2,j}\ \leq\ ...\ \leq\ X_{M,j} $ が成り立ちます. また,高橋君は,折れ線の曲がり方について $ K $ 個の条件を満たすように折れ線を描かなければなりません. $ i $ 番目の条件は $ (A_i,\ B_i,\ C_i) $ で表され,これは次を意味します: - $ C_i=0 $ のときは,折れ線 $ A_i $ を描くとき,$ B_i $ 回目の移動においては,その時いる点のすぐ左下の点を選ぶ. - $ C_i=1 $ のときは,折れ線 $ A_i $ を描くとき,$ B_i $ 回目の移動においては,その時いる点のすぐ右下の点を選ぶ. すなわち,$ X_{A_i,\ {B_i}+1}\ =\ X_{A_i,\ B_i}\ +\ C_i $ を意味します. 高橋君が $ M $ 個の折れ線を描く方法が何通りあるかを mod $ 1000000007 $ で求めてください.

输入输出格式

输入格式


入力は以下の形式で標準入力から与えられる。 > $ N $ $ M $ $ K $ $ A_1 $ $ B_1 $ $ C_1 $ $ A_2 $ $ B_2 $ $ C_2 $ : $ A_K $ $ B_K $ $ C_K $

输出格式


高橋君が $ M $ 個の折れ線を描く方法は何通りあるかを mod $ 1000000007 $ で出力せよ.

输入输出样例

输入样例 #1

3 2 1
1 2 0

输出样例 #1

6

输入样例 #2

3 2 2
1 1 1
2 1 0

输出样例 #2

0

输入样例 #3

5 4 2
1 3 1
4 2 0

输出样例 #3

172

输入样例 #4

20 20 0

输出样例 #4

881396682

说明

### 注意 提出を行う前に,「コードテスト」を利用して実行時間を計測することを強く推奨する. ### 制約 - $ 1\ \leq\ N\ \leq\ 20 $ - $ 1\ \leq\ M\ \leq\ 20 $ - $ 0\ \leq\ K\ \leq\ (N-1)M $ - $ 1\ \leq\ A_i\ \leq\ M $ - $ 1\ \leq\ B_i\ \leq\ N-1 $ - $ C_i\ =\ 0,1 $ - $ (A_i,\ B_i) $ として同じ組は複数回与えられない. ### Sample Explanation 1 下図に示すように,$ 6 $ 通りの描き方があります.ただし,赤線は折れ線 $ 1 $,緑線は折れ線 $ 2 $ を表します: !\[\](https://atcoder.jp/img/agc017/75921b6e5a59ab17b4c07ada848b9f14.png)