#include using namespace std; using ull = unsigned long long; using ll = long long; using ld = long double; using pi = pair; using pll = pair; using vi = vector; using vvi = vector; using vl = vector; using vvl = vector; template using minQ = priority_queue, greater>; #define endl '\n' #define ALL(a) (a).begin(),(a).end() #define FOR(i,a,b) for(ll i = (ll)(a); i < (ll)(b); ++i) #define FORO(i,a,b) for(ll i = (ll)(a); i <= (ll)(b); ++i) #define RFOR(i,a,b) for(ll i = (ll)(b) - 1; i >= (ll)(a); --i) #define RFORO(i,a,b) for(ll i = (ll)(b); i >= (ll)(a); --i) #define REP(i,n) for(ll i = 0; i < (ll)(n); ++i) #define REPO(i,n) for(ll i = 1; i <= (ll)(n); ++i) #define RREP(i,n) for(ll i = (ll)(n) - 1; i >= 0; --i) #define RREPO(i,n) for(ll i = (ll)(n); i >= 1; --i) #define SORT(a) sort(ALL(a)) #define UNIQ(a) a.erase(unique(ALL(a)), a.end()) #define SUNIQ(a) SORT(a), UNIQ(a) #define MINI(a,b) a=min(a,(b)) #define MAXI(a,b) a=max(a,(b)) #define puts(a) cout<<(a)<> a; return a; } ld Nld() { ld a; cin >> a; return a; } int Ni() { int a; cin >> a; return a; } char Nc() { char a; cin >> a; return a; } string Ns() { string a; cin >> a; return a; } template void O(T &&a) { puts(a); } template void Os(const vector &v) { REP(i, v.size()) cout << v[i] << " \n"[i + 1 == (ll)v.size()]; } template void Os(vector &&v) { REP(i, v.size()) cout << v[i] << " \n"[i + 1 == (ll)v.size()]; } template void Is(vector &v) { for (auto& t : v) cin >> t; } void yes(bool f = true) { puts(f ? "yes" : "no"); } void Yes(bool f = true) { puts(f ? "Yes" : "No"); } void YES(bool f = true) { puts(f ? "YES" : "NO"); } struct Edge { int from, to; Edge() {} Edge(int f, int t) : from(f), to(t) {} }; using Edges = vector; using Graph = vector; void solve(); int main() { ios::sync_with_stdio(false), cin.tie(0); cout << fixed << setprecision(20); solve(); } //-----------------------------------------------template------------------------------------------------------------ //-----------------------------------------------library------------------------------------------------------------- const int MAX = 2e6; ll fac[MAX + 1], ifac[MAX + 1]; ll Pow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } ll C(ll n, ll k) { if (k < 0 || n < k) return 0; return fac[n] * ifac[k] % mod * ifac[n - k] % mod; } ll P(ll n, ll k) { if (k < 0 || n < k) return 0; return fac[n] * ifac[n - k] % mod; } ll H(ll n, ll k) { return fac[n + k - 1] * ifac[k] % mod * ifac[n - 1] % mod; } void solve() { fac[0] = 1; REPO(i, MAX) fac[i] = fac[i - 1] * i % mod; ifac[MAX] = Pow(fac[MAX], mod - 2); RREP(i, MAX) ifac[i] = ifac[i + 1] * (i + 1) % mod; int T = Ni(); while (T--) { char c = Nc(); Nc(); ll N = Ni(); Nc(); ll K = Ni(); Nc(); if (c == 'C') { O(C(N, K)); } else if (c == 'P') { O(P(N, K)); } else if (c == 'H') { O(H(N, K)); } else { exit(EXIT_FAILURE); } } }