CTS2019 题解
Posted sjkmost
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTS2019 题解相关的知识,希望对你有一定的参考价值。
随机立方体
设$f_i$为恰有$i$个极大值的概率,$g_i$为至少有$i$个极大值的概率。
先求方案数,考虑组合意义,第$i$大的数相当于要是$nml-(n-k+i-1)(m-k+i-1)(l-k+i+1)$个数(包括它直接控制和被比它小的的极大值控制的)中最大的,那么设$h_i$为选$i$个极大值的方案数,则
$$h_i=\prod_{j=0}^{i-1}(n-j)(m-j)(l-j)$$
故
$$g_i=h_i\prod_{j=1}^i\frac{1}{nml-(n-k+j-1)(m-k+j-1)(l-k+j+1)}$$
又
$$g_i=\sum_{j=i}^n\binom{j}{i}f_j$$
二项式反演即可,注意线性求逆元。
1 #include <bits/stdc++.h> 2 3 #define IL __inline__ __attribute__((always_inline)) 4 5 #define For(i, a, b) for (int i = (a), i##end = (b); i <= i##end; ++ i) 6 #define FOR(i, a, b) for (int i = (a), i##end = (b); i < i##end; ++ i) 7 #define Rep(i, a, b) for (int i = (a), i##end = (b); i >= i##end; -- i) 8 #define REP(i, a, b) for (int i = (a) - 1, i##end = (b); i >= i##end; -- i) 9 10 typedef long long LL; 11 12 template <class T> 13 IL bool chkmax(T &a, const T &b) { 14 return a < b ? ((a = b), 1) : 0; 15 } 16 17 template <class T> 18 IL bool chkmin(T &a, const T &b) { 19 return a > b ? ((a = b), 1) : 0; 20 } 21 22 template <class T> 23 IL T mymax(const T &a, const T &b) { 24 return a > b ? a : b; 25 } 26 27 template <class T> 28 IL T mymin(const T &a, const T &b) { 29 return a < b ? a : b; 30 } 31 32 template <class T> 33 IL T myabs(const T &a) { 34 return a > 0 ? a : -a; 35 } 36 37 const int INF = 0X3F3F3F3F; 38 const double EPS = 1E-8, PI = acos(-1.0); 39 40 #define DEBUG(...) fprintf(stderr, __VA_ARGS__) 41 #define OK DEBUG("Passing [%s] in LINE %d...\n", __FUNCTION__, __LINE__) 42 43 const int MAXN = 5000000 + 5; 44 45 namespace Math { 46 const int MOD = 998244353; 47 48 IL int add(int a, int b) { 49 a += b; 50 return a >= MOD ? a - MOD : a; 51 } 52 53 template <class ...Args> 54 IL int add(int a, const Args &...args) { 55 a += add(args...); 56 return a >= MOD ? a - MOD : a; 57 } 58 59 IL int sub(int a, int b) { 60 a -= b; 61 return a < 0 ? a + MOD : a; 62 } 63 64 IL int mul(int a, int b) { 65 return (LL)a * b % MOD; 66 } 67 68 template <class ...Args> 69 IL int mul(int a, const Args &...args) { 70 return (LL)a * mul(args...) % MOD; 71 } 72 73 IL int quickPow(int a, int p) { 74 int result = 1; 75 for (; p; p >>= 1, a = mul(a, a)) { 76 if (p & 1) { 77 result = mul(result, a); 78 } 79 } 80 return result; 81 } 82 } 83 84 using namespace Math; 85 86 int f[MAXN], g[MAXN], inv_g[MAXN], fac[MAXN], ifac[MAXN]; 87 88 IL void init(int n) { 89 fac[0] = 1; 90 For(i, 1, n) { 91 fac[i] = mul(fac[i - 1], i); 92 } 93 ifac[n] = quickPow(fac[n], MOD - 2); 94 REP(i, n, 0) { 95 ifac[i] = mul(ifac[i + 1], i + 1); 96 } 97 } 98 99 IL int binom(int n, int m) { 100 return mul(fac[n], ifac[m], ifac[n - m]); 101 } 102 103 int main() { 104 int T; 105 scanf("%d", &T); 106 while (T --) { 107 int n, m, l, k; 108 scanf("%d%d%d%d", &n, &m, &l, &k); 109 int mult = mul(n, m, l), min = mymin(n, mymin(m, l)); 110 init(min); 111 int cur = 1; 112 f[0] = 1; 113 For(i, 1, min) { 114 f[i] = mul(f[i - 1], n - i + 1, m - i + 1, l - i + 1); 115 g[i] = sub(mult, mul(n - i, m - i, l - i)); 116 cur = mul(cur, g[i]); 117 } 118 inv_g[min] = quickPow(cur, MOD - 2); 119 REP(i, min, 0) { 120 inv_g[i] = mul(inv_g[i + 1], g[i + 1]); 121 } 122 int answer = 0; 123 cur = 1; 124 For(i, k, min) { 125 answer = add(answer, mul(cur, f[i], inv_g[i], binom(i, k))); 126 cur = mul(cur, MOD - 1); 127 } 128 printf("%d\n", answer); 129 } 130 return 0; 131 }
以上是关于CTS2019 题解的主要内容,如果未能解决你的问题,请参考以下文章
CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段