// yukicoder: No.117 組み合わせの数 // 2019.5.2 bal4u #include #if 1 #define gc() getchar_unlocked() #define pc(c) putchar_unlocked(c) #else #define gc() getchar() #define pc(c) putchar(c) #endif int in() // 非負整数の入力 { int n = 0, c = gc(); do n = 10 * n + (c & 0xf), c = gc(); while (c >= '0'); return n; } void out(int n) // 非負整数の表示(出力) { int i; char b[20]; if (!n) pc('0'); else { i = 0; while (n) b[i++] = n % 10 + '0', n /= 10; while (i--) pc(b[i]); } pc('\n'); } #define M 1000000007 #define MAX 1000000 #define MAX2 2000000 int fact[MAX2+2], inv[MAX+2], factinv[MAX+2]; int comb(int n, int k) { if (n < k) return 0; if (k == 0) return 1; return ((((long long)fact[n] * factinv[k]) % M) * (long long)factinv[n-k]) % M; } int perm(int n, int k) { if (n < k) return 0; return ((long long)fact[n] * factinv[n-k]) % M; } int hcomb(int n, int k) { if (n == 0 && k == 0) return 1; return (((long long)fact[n+k-1]*factinv[k]) % M * (long long)factinv[n-1]) % M; } int main() { int i, T, id, N, K, ans; fact[0] = 1; for (i = 1; i <= MAX2; i++) fact[i] = ((long long)fact[i-1]*i) % M; inv[1] = 1; for (i = 2; i <= MAX; i++) { inv[i] = (-(M/i)*(long long)inv[M % i]) % M; if (inv[i] < 0) inv[i] += M; } factinv[0] = 1; for (i = 1; i <= MAX; i++) factinv[i] = ((long long)factinv[i-1]*inv[i]) % M; T = in(); while (T--) { id = gc(), gc(); N = in(), K = in(), gc(); if (id == 'C') ans = comb(N, K); else if (id == 'P') ans = perm(N, K); else ans = hcomb(N, K); out(ans); } return 0; }