#include #define sz(x) (int)x.size() #define pb push_back #define FOR(i, n) for(int i = 0; i < (n); ++i) #define ii pair #define f first #define s second #define ll long long using namespace std; const int N = 1e5+7; const int INF = 1e9+7; int suma; int tab[1000]; int grid[2][N]; int n, m, k; void backtrack(int ile){ if(ile == 0){ tab[suma]++; return; } for(int i = 0; i <= 9; i++){ suma+=i; backtrack(ile-1); suma-=i; } } int suma_a; int suma_b; ll dp[N][20][20]; ii nast(ii a){ if(a == make_pair(0, 0)){ return make_pair(0, 1); } if(a == make_pair(0, 1)){ return {1, 0}; } if(a == make_pair(1, 0)){ return {1 , 1}; } if(a == make_pair(1, 1)){ return {1, 1}; } return {1, 1}; } void backtrack2(ii poz, int ile){ if(ile == 0){ if(k - suma_a - suma_b <= 18 && suma_a + suma_b <= k){ dp[1][k-suma_a - suma_b][suma_a]++; } return; } int val = grid[poz.f][poz.s]; if(val == -1){ for(int i = 0 ; i <= 9; i++){ if(poz.s){ suma_b += i; backtrack2(nast(poz), ile-1); suma_b -= i; } else{ suma_a += i; backtrack2(nast(poz), ile-1); suma_a -= i; } } } else{ if(poz.s){ suma_b += val; backtrack2(nast(poz), ile-1); suma_b -= val; } else{ suma_a += val; backtrack2(nast(poz), ile-1); suma_a -= val; } } } void pocz(){ backtrack2({0, 0}, 4); } ll ans = 0; ll sp[20]; void solve(){ for(int i = 1; i < n-1; i++){ FOR(a, 20){ sp[a] = 0; } // policz sp if(grid[0][i+1] == -1 && grid[1][i+1] == -1){ FOR(a, 20){ sp[a] = tab[a]; } } else if(grid[0][i+1] == -1){ FOR(a, 10){ sp[grid[1][i+1] + a] = 1; } } else if(grid[1][i+1] == -1){ FOR(a, 10){ sp[grid[0][i+1]+a] = 1; } } else{ sp[grid[0][i+1] + grid[1][i+1]] = 1; } for(int a = 0 ; a <= 18; a++){ for(int b = 0; b <= 18; b++){ int A = a; int C = b; int B = k - A-C; if(B < 0 || B > 18 || k - (B+C) < 0 || k-(B+C) > 18) continue; if(i == n-2 && A + B + C == k){ ans = (ans + (dp[i+1][k-(B+C)][B] + dp[i][b][a] * sp[C]))%INF; } dp[i+1][k-(B+C)][B] = (dp[i+1][k-(B+C)][B] + dp[i][b][a] * sp[C])%INF; } } } } signed main(){ ios::sync_with_stdio(0); cin.tie(0); backtrack(2); cin >> n >> k >> m; for(int i = 0 ; i < n; i++){ grid[0][i] = grid[1][i] = -1; } for(int i = 0 ; i < m ;i++){ int a, b; cin >> a >> b >> grid[b][a]; } pocz(); solve(); cout << ans << '\n'; return 0; } /* 3 2 0 3 2 4 2 0 0 0 0 0 */