using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Web; namespace Competitive { internal class Solution { public long T; public FermatCombination comb; public void Run() { // C(N, K) -- Combination // P(N, K) -- Factrial // H(N, K) -- C(N+K-1, K) (n==k==0 -- corner case) comb = new FermatCombination(2000000); T = Input.ReadInt(); for (int i = 0; i < T; i++) { string s = Console.ReadLine(); string tp = s.Substring(0, 1); string tpl = s.Substring(2, s.Length - 3); int n = int.Parse(tpl.Split(',')[0]); int k = int.Parse(tpl.Split(',')[1]); long val; if (tp == "C") val = C(n, k); else if (tp == "P") val = P(n, k); else val = H(n, k); Console.WriteLine(val); } } public long C(int n, int k) { if (n - k < 0) return 0; return comb.Combination(n, k); } public long P(int n, int k) { if (n - k < 0) return 0; return comb.Permutation(n, k); } public long H(int n, int k) { if (n == 0 && n == k) return 1; return C(n + k - 1, k); } } // libs ---------- class FermatCombination { public long[] Factrial; // 階乗 public long[] Inverse; // 逆元 public long MOD = 1000000007; public FermatCombination(int n) { Factrial = new long[n + 1]; Inverse = new long[n + 1]; Factrial[0] = 1; Inverse[0] = 1; for (int i = 1; i <= n; i++) { Factrial[i] = (Factrial[i - 1] * i) % MOD; } for (int i = 1; i <= n; i++) { // フェルマーの小定理で逆元を求める Inverse[i] = Power(Factrial[i], (int)MOD - 2, MOD) % MOD; } } public long Permutation(int n, int k) { return Factrial[n] * Inverse[n - k] % MOD; } public long Combination(int n, int k) { return Factrial[n] * Inverse[k] % MOD * Inverse[n - k] % MOD; } public static long Power(long x, long n, long M) { long tmp = 1; if (n > 0) { tmp = Power(x, n / 2, M); if (n % 2 == 0) tmp = (tmp * tmp) % M; else tmp = (((tmp * tmp) % M) * x) % M; } return tmp; } } // common ---------- internal static class Input { public static string ReadString() { string line = Console.ReadLine(); return line; } public static int ReadInt() { string line = Console.ReadLine(); return int.Parse(line); } public static int[] ReadIntArray() { string line = Console.ReadLine(); return line.Split(' ').Select(int.Parse).ToArray(); } public static long ReadLong() { string line = Console.ReadLine(); return long.Parse(line); } public static long[] ReadLongArray() { string line = Console.ReadLine(); return line.Split(' ').Select(long.Parse).ToArray(); } public static double[] ReadDoubleArray() { string line = Console.ReadLine(); return line.Split(' ').Select(double.Parse).ToArray(); } } internal class Program { public static void Main(string[] args) { var s = new Solution(); s.Run(); } } }