#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll MOD = 998244353; // 模数 // 快速幂算法 // 功能:计算 a^b % mod // 原理:利用二进制拆分,将指数b表示为二进制形式 // 例如:3^13 = 3^(1101₂) = 3^8 × 3^4 × 3^1 ll power(ll a, ll b, ll mod) { ll result = 1; // 初始结果为1 a %= mod; // 先对a取模,防止溢出 while (b > 0) { // 当指数大于0时继续 // 检查b的最低位是否为1 if (b & 1) { // 相当于 if (b % 2 == 1) // 如果当前位是1,将对应的a^(2^i)乘入结果 result = result * a % mod; } // a自乘,从a^1变成a^2, a^4, a^8, ... a = a * a % mod; // b右移一位,相当于b除以2 b >>= 1; // 相当于 b /= 2 } return result; } // 模逆元 // 功能:计算 a 在模 mod 下的乘法逆元 // 定义:若 a × x ≡ 1 (mod p),则称x为a的逆元,记作a^(-1) // 原理:根据费马小定理,当p为质数时,a^(p-1) ≡ 1 (mod p) // 因此 a^(p-2) × a ≡ 1 (mod p) // 所以 a^(-1) = a^(p-2) mod p ll inv(ll a, ll mod) { // 利用费马小定理:a^(-1) = a^(mod-2) mod mod return power(a, mod - 2, mod); } int main() { ios::sync_with_stdio(false), cin.tie(0); int T; cin >> T; // 卡特兰数C(n)表示:n个元素的合法出栈序列数 // 卡特兰数:C(n) = (2n)! / ((n+1)! × n!) int maxN = 100005; // 最大n值(根据题目数据范围1≤𝑁≤10^5) vector<ll> catalan(maxN); // 初始条件 catalan[0] = 1; // C(0) = 1 catalan[1] = 1; // C(1) = 1 // 递推计算卡特兰数 // 递推公式:C(n) = C(n-1) × 2(2n-1) / (n+1) // 推导过程: // C(n) = (2n)! / ((n+1)! × n!) // C(n-1) = (2n-2)! / (n! × (n-1)!) // C(n) / C(n-1) = [(2n)! / ((n+1)! × n!)] / [(2n-2)! / (n! × (n-1)!)] // = (2n)! × n! × (n-1)! / ((n+1)! × n! × (2n-2)!) // = (2n)(2n-1)(2n-2)! / ((n+1) × n × (n-1)! × n!) // = (2n)(2n-1) / ((n+1) × n) // = 2(2n-1) / (n+1) // 因此:C(n) = C(n-1) × 2(2n-1) / (n+1) for (int i = 2; i < maxN; i++) { // 计算 C(i) = C(i-1) × 2(2i-1) / (i+1) // 步骤1:C(i-1) × 2(2i-1) catalan[i] = catalan[i - 1] * (4 * i - 2) % MOD; // 步骤2:除以 (i+1) // 在模运算下,除法 = 乘以逆元 // a / b ≡ a × b^(-1) (mod p) catalan[i] = catalan[i] * inv(i + 1, MOD) % MOD; } // 处理每个测试用例 for (int caseNum = 1; caseNum <= T; caseNum++) { int n; cin >> n; ll result; // 特判:n=1时,A1不能第一个出栈,无解 if (n == 1) { result = 0; } else { // 答案 = C(n) - C(n-1) // C(n):所有合法的出栈序列数 // C(n-1):A1第一个出栈的序列数(相当于剩余n-1个元素的标准问题) // C(n) - C(n-1):A1不第一个出栈的序列数 result = (catalan[n] - catalan[n - 1] + MOD) % MOD; // 加MOD是为了防止结果为负数 // 在模运算下,(a - b) % MOD 可能是负数 // 正确做法:(a - b + MOD) % MOD } cout << "Case #" << caseNum << ": " << result << '\n'; } return 0; }