1991. AC的魔法课堂

考点:卡特兰数

A_i

给定四个正整数 a,b,c,d ,满足 a,下列式子成立:

  • ad+bc

所以,衍生到 2n 个数的排列,上述结论成立。

对于每对配对的数对 (A_i,C_i) , 可以看作一对”括号“,有 2^n 种方案通过交换左右括号中的数,有 n! 种方案通过排列数对出现的顺序,然后再乘上 cal_n ( n 对括号时的卡特兰数),就是满足最低瑕疵的方案数。

所以失误率为: $$ \frac{2n!-2^nn!cal_n}{2n!} $$

#include<bits/stdc++.h> using namespace std; #define int long long #define endl '\n' using ll = long long; #define N 200000 const int mod = 998244353; int cal[N + 10]; int qpow(int x, int y) { int rs = 1; while (y) { if (y & 1) rs = rs * x % mod; x = x * x % mod; y >>= 1; } return rs; } signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n; cin >> n; cal[0] = 1; for (int i = 1; i <= N; i++) { cal[i] = (4 * i - 2) * cal[i - 1] % mod * qpow(i + 1, mod - 2) % mod; } int num = cal[n] * qpow(2, n) % mod; for (int i = 1; i <= n; i++) { num = num * i % mod; } int sum = 1; for (int i = 1; i <= 2 * n; i++) { sum = sum * i % mod; } int ans = ((sum - num) % mod + mod) % mod * qpow(sum, mod - 2) % mod; cout << ans; return 0; }