#pragma GCC optimize ("O3") #pragma GCC target ("avx") #include "bits/stdc++.h" // define macro "/D__MAI" using namespace std; typedef long long int ll; #define debugv(v) {printf("L%d %s > ",__LINE__,#v);for(auto e:v){cout< ",__LINE__,#m);for(int x=0;x<(w);x++){cout<<(m)[x]<<" ";}cout<\n",__LINE__,#m);for(int y=0;y<(h);y++){for(int x=0;x<(w);x++){cout<<(m)[y][x]<<" ";}cout< ostream& operator <<(ostream &o, const pair p) { o << "(" << p.first << ":" << p.second << ")"; return o; } template T& maxset(T& to, const T& val) { return to = max(to, val); } template T& minset(T& to, const T& val) { return to = min(to, val); } void bye(string s, int code = 0) { cout << s << endl; exit(code); } mt19937_64 randdev(8901016); inline ll rand_range(ll l, ll h) { return uniform_int_distribution(l, h)(randdev); } #if defined(_WIN32) || defined(_WIN64) #define getchar_unlocked _getchar_nolock #define putchar_unlocked _putchar_nolock #elif defined(__GNUC__) #else #define getchar_unlocked getchar #define putchar_unlocked putchar #endif namespace { #define isvisiblechar(c) (0x21<=(c)&&(c)<=0x7E) class MaiScanner { public: template void input_integer(T& var) { var = 0; T sign = 1; int cc = getchar_unlocked(); for (; cc<'0' || '9'>(int& var) { input_integer(var); return *this; } inline MaiScanner& operator>>(long long& var) { input_integer(var); return *this; } inline MaiScanner& operator>>(string& var) { int cc = getchar_unlocked(); for (; !isvisiblechar(cc); cc = getchar_unlocked()); for (; isvisiblechar(cc); cc = getchar_unlocked()) var.push_back(cc); return *this; } template void in(IT begin, IT end) { for (auto it = begin; it != end; ++it) *this >> *it; } }; class MaiPrinter { public: template void output_integer(T var) { if (var == 0) { putchar_unlocked('0'); return; } if (var < 0) putchar_unlocked('-'), var = -var; char stack[32]; int stack_p = 0; while (var) stack[stack_p++] = '0' + (var % 10), var /= 10; while (stack_p) putchar_unlocked(stack[--stack_p]); } inline MaiPrinter& operator<<(char c) { putchar_unlocked(c); return *this; } inline MaiPrinter& operator<<(int var) { output_integer(var); return *this; } inline MaiPrinter& operator<<(long long var) { output_integer(var); return *this; } inline MaiPrinter& operator<<(char* str_p) { while (*str_p) putchar_unlocked(*(str_p++)); return *this; } inline MaiPrinter& operator<<(const string& str) { const char* p = str.c_str(); const char* l = p + str.size(); while (p < l) putchar_unlocked(*p++); return *this; } template void join(IT begin, IT end, char sep = '\n') { for (auto it = begin; it != end; ++it) *this << *it << sep; } }; } MaiScanner scanner; MaiPrinter printer; template inline T gcd(T a, T b) { while (b) { T t = a % b; a = b; b = t; }return a; } template inline T lcm(T a, T b) { return a * b / gcd(a, b); } // MEMO : 逆元...pow_md(n,MOD-2,MOD) template T pow_md(T x, T p, T mod = MD) { T y = 1; x = x % mod; while (0>= 1; } return y; } template T fact_md(T n, T mod = MD) { T p = 1; for (; 1 T nPr_md(T n, T r, T mod = MD) { T p = 1; for (r=n-r; r T nCr_md(T n, T r, T mod = MD) { if (n / 2 < r) return nCr_md(n, n - r); T p = 1; for (; 0 T nHr_md(T n, T r, T mod = MD) { return nCr_md(n - 1 + r, n - 1, mod); } const ll HIGH = 2000000; ll muls_d[HIGH+10]; ll divs_d[HIGH+10]; ll *muls = muls_d + 1; ll *divs = divs_d + 1; inline ll my_nPk(ll n, ll k) { return (muls[n] * divs[(n - k)]) % MD; } inline ll my_nCk(ll n, ll k) { assert(n < HIGH && k < HIGH); return (((muls[n] * divs[(n - k)]) % MD) * divs[k]) % MD; } inline ll my_nHr(ll n, ll r) { return my_nCk(n - 1 + r, n - 1); } int main() { muls[-1] = muls[0] = muls[1] = divs[-1] = divs[0] = divs[1] = 1; iterate(i, 2ll, HIGH+5) { muls[i] = (muls[i - 1] * i) % MD; divs[i] = (divs[i - 1] * pow_md(i, MD - 2)) % MD; } // iterate(y, 1ll, 5) { // iterate(x, y, 6) { // cout << " " << make_pair(x,y) << endl; // cout << make_pair(my_nCk(x, y),nCr_md(x, y)) << endl; // cout << make_pair(my_nPk(x, y),nPr_md(x, y)) << endl; // cout << make_pair(my_nHr(x, y),nHr_md(x, y)) << endl; // assert(my_nCk(x, y) == nCr_md(x, y)); // assert(my_nPk(x, y) == nPr_md(x, y)); // assert(my_nHr(x, y) == nHr_md(x, y)); // } // } // return 0; ll q; cin >> q; repeat(i, q) { char c; ll n, k; scanf("\n%c(%lld,%lld)", &c, &n, &k); // cerr << c << make_pair(n, k) << endl; if (c == 'H') { printer << my_nHr(n, k) << '\n'; } else if (c == 'C') { printer << (n < k ? 0 : k == 0 ? 1 : my_nCk(n, k)) << '\n'; } else { printer << my_nPk(n, k) << '\n'; } } return 0; }