#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mp make_pair #define pb push_back #define all(x) (x).begin(),(x).end() #define YES() printf("YES\n") #define NO() printf("NO\n") using namespace std; #define int long long //typedef long long ll; typedef unsigned long long ull; typedef vector vb; typedef vector vi; typedef vector vvb; typedef vector vvi; //typedef pair P; const int INF=1e+13; const double EPS=1e-9; const int MOD = 1000000007; const int dx[]={1,0,-1,0},dy[]={0,-1,0,1}; int cnt[5],comb[100][100] = {}; int gx,gy,k,x[5],y[5],n[5],res = 0; void dfs(int num){ if(num == k){ int xx = 0,yy = 0,sum = 0; for(int i = 0;i < k;i++){ xx += x[i] * cnt[i]; yy += y[i] * cnt[i]; sum += cnt[i]; } if(xx != gx || yy != gy) return; int plus = 1,now = sum; for(int i = 0;i < k;i++){ plus = plus * comb[now][now - cnt[i]] % MOD; now -= cnt[i]; } res = (res + plus) % MOD; return; } for(int i = 0;i <= n[num];i++){ cnt[num] = i; dfs(num + 1); } } signed main(){ cin >> gx >> gy >> k; for(int i = 0;i < 100;i++){ comb[i][0] = 1; comb[i][i] = 1; } for(int i = 1;i < 100;i++){ for(int j = 1;j < i;j++){ comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1]) % MOD; } } for(int i = 0;i < k;i++){ cin >> x[i] >> y[i] >> n[i]; } dfs(0); cout << res << endl; return 0; }