码迷,mamicode.com
首页 > 其他好文 > 详细

CTS2019 题解

时间:2019-05-30 18:07:48      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:rod   scanf   img   意义   math   none   $$   quic   hid   

随机立方体

设$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 }
View Code

 

CTS2019 题解

标签:rod   scanf   img   意义   math   none   $$   quic   hid   

原文地址:https://www.cnblogs.com/sjkmost/p/10950638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!