#include using namespace std; using ll = long long; using PII = std::pair; using PLL = std::pair; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rep2(i, s, n) for (int i = (s); i < (int)(n); i++) ll pow_mod(int p, int q, int mod) { ll ret, r; ret = 1; r = p; while (q > 0) { if (q % 2) { ret *= r; ret %= mod; } r = (r * r) % mod; q /= 2; } return ret % mod; } int main() { #ifdef DEBUG cout << "DEBUG MODE" << endl; ifstream in("input.txt"); //for debug cin.rdbuf(in.rdbuf()); //for debug #endif const int mod = 1e9 + 7; const int imax = 1e6; ll t, a, b, status, ans; string s, sa, sb; vector frac, frac_inv; frac.push_back(1); frac_inv.push_back(1); a = b = 1; rep(i, imax) { a *= i + 1; a %= mod; frac.push_back(a); b *= pow_mod(i + 1, mod - 2, mod); b %= mod; frac_inv.push_back(b); } cin >> t; rep(i, t) { sa = sb = ""; status = 0; cin >> s; for (auto z : s.substr(2, s.length() - 3)) { if (z == ',') { status++; } else if (status == 0) { sa += z; } else if (status == 1) { sb += z; } } a = stoll(sa), b = stoll(sb); if (s[0] == 'C') { if (b > a) { ans = 0; } else { ans = frac[a] * frac_inv[b]; ans %= mod; ans *= frac_inv[a - b]; ans %= mod; } } else if (s[0] == 'P') { if (b > a) { ans = 0; } else { ans = frac[a] * frac_inv[a - b]; ans %= mod; } } else if (s[0] == 'H') { ans = frac[a + b - 1] * frac_inv[b]; ans %= mod; ans *= frac_inv[a - 1]; ans %= mod; } cout << ans << endl; } return 0; }