题解

用容斥,算至少K个极大值的方案数

我们先钦定每一维的K个数出来,然后再算上排列顺序是

\(w_{k} = \binom{n}{k}\binom{m}{k}\binom{l}{k}(k!)^3\)

然后有\((n - k)(m - k)(l - k)\)是可以随便填的

设\(all = nml,v_k = nml - (n - k)(m - k)(l - k)\)

设剩下的数填的方案是\(h_k\)

那么答案就是\(w_kh_k \binom{all}{all - v_{k}}(all - v_k)!\)

我们可以发现应该是每次选一个最大的作为极大值,然后再选出\(v[k] - v[k - 1] - 1\)作为极大值的陪葬而不能让它们去侵占下一个极大值的位置

所以\(h_{k} = h_{k - 1}\frac{(v_{k} - 1)!}{v_{k - 1} !}\)

然后至少k个的答案就是

\(w_{k}\frac{all!}{v_{k}!}\prod_{i = 1}^{k} \frac{(v_{k} - 1)!}{v_{k - 1}!}\)

我们发现后面那部分可以约掉很多

最后就是

\(all!w_{k}\prod_{i = 1}^{k}\frac{1}{v_k}\)

最后应该除下来一个\(all!\)因为算的是概率

设至少k个的答案是\(f_k\)

最后答案就是

\(ans = \sum_{i = K}^{min(N,M,L)}(-1)^{i - K}\binom{i}{K}f_{k}\)

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 2005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 998244353;
const int V = 5000000;
int N,M,L,K;
int fac[V + 5],invfac[V + 5],w[V + 5],v[V + 5],inv[V + 5];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
int mul3(int a,int b,int c) {
return mul(mul(a,b),c);
}
void update(int &x,int y) {
x = inc(x,y);
}
int C(int n,int m) {
if(n < m) return 0;
else return mul(fac[n],mul(invfac[m],invfac[n - m]));
}
int fpow(int x,int c) {
int res = 1,t = x;
while(c) {
if(c & 1) res = mul(res,t);
t = mul(t,t);
c >>= 1;
}
return res;
}
void pre_process() {
fac[0] = 1;
for(int i = 1 ; i <= V ; ++i) fac[i] = mul(fac[i - 1],i);
invfac[V] = fpow(fac[V],MOD - 2);
for(int i = V - 1 ; i >= 0 ; --i) invfac[i] = mul(invfac[i + 1],i + 1);
}
void Solve() {
read(N);read(M);read(L);read(K);
int T = min(min(N,M),L);
for(int i = 0 ; i <= T ; ++i) {
int t = mul3(fac[i],fac[i],fac[i]);
w[i] = mul3(C(N,i),C(M,i),C(L,i));
w[i] = mul(w[i],t);
}
int ALL = mul3(N,M,L);
for(int i = 0 ; i <= T ; ++i) {
int t = mul3(N - i,M - i,L - i);
v[i] = inc(ALL,MOD - t);
}
int p = 1;
for(int i = 1 ; i <= T ; ++i) {
p = mul(p,v[i]);
}
inv[T] = fpow(p,MOD - 2);
for(int i = T - 1 ; i >= 1 ; --i) inv[i] = mul(inv[i + 1],v[i + 1]);
int res = 0;
for(int i = K ; i <= T ; ++i) {
if((i - K) & 1) update(res,MOD - mul3(C(i,K),inv[i],w[i]));
else update(res,mul3(C(i,K),inv[i],w[i]));
}
out(res);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
pre_process();
int T;
read(T);
while(T--) Solve();
return 0;
}

【LOJ】#3119. 「CTS2019 | CTSC2019」随机立方体的更多相关文章

  1. LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)

    博客链接 里面有个下降幂应该是上升幂 还有个bk的式子省略了k^3 CODE 蛮短的 #include <bits/stdc++.h> using namespace std; const ...

  2. LOJ #3119. 「CTS2019 | CTSC2019」随机立方体 组合计数+二项式反演

    好神的一道计数题呀. code: #include <cstdio> #include <algorithm> #include <cstring> #define ...

  3. 「CTS2019 | CTSC2019」随机立方体 解题报告

    「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...

  4. LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体

    题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...

  5. LOJ3119. 「CTS2019 | CTSC2019」随机立方体 二项式反演

    题目传送门 https://loj.ac/problem/3119 现在 BZOJ 的管理员已经不干活了吗,CTS(C)2019 和 NOI2019 的题目到现在还没与传上去. 果然还是 LOJ 好. ...

  6. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  7. LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP

    题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...

  8. @loj - 3120@ 「CTS2019 | CTSC2019」珍珠

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 \(n\) 个在范围 \([1, D]\) 内的整数均匀随机 ...

  9. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

随机推荐

  1. LA 7043 International Collegiate Routing Contest 路由表 字典树离散化+bitset 银牌题

    题目链接:给你n(n<=3e4)个路由地址(注意有子网掩码现象), 路由地址:128.0.0.0/1的形式 要求你输出一个路由集合,其是给定的路由集合的补集,且个数越少越好 #include & ...

  2. 【luoguP1311 】选择客栈

    题目描述 丽江河边有nn家很有特色的客栈,客栈按照其位置顺序从 11到nn编号.每家客栈都按照某一种色调进行装饰(总共 kk 种,用整数 00 ~k-1k−1 表示),且每家客栈都设有一家咖啡店,每家 ...

  3. 一次router拦截器的应用

    实现 退出登陆  无法回退到其它页面 当有登陆状态时  可以拿其它页面的地址直接访问 若没有登陆状态   拿其它页面的地址直接访问 会报错 router.beforeEach((to, from, n ...

  4. MFC消息反射机制

    消息反射机制要解决什么问题呢? 消息反射机制主要是为了控件而实现的.每当控件需要某些资讯(比如,绘制自身背景的画刷,显示字体的颜色等等)时,都会频繁地向其父窗口发送通告消息(notification ...

  5. Postman中的全局/环境/集合变量的使用及优先级

    变量的使用场景 Postman的变量主要用于参数化和关联 应用1: 常用变量可以按使用范围设置成集合或全局变量 应用2: 一套接口要在不同的环境上测试时, 可以新建两个环境,比如test环境和stag ...

  6. chromedriver安装

    chromedriver.exe下载 淘宝的镜像地址可以下载 https://npm.taobao.org/mirrors/chromedriver/ 找到自己chrome浏览器适合的chromeDr ...

  7. 焦虑的 BAT、不安的编程语言,揭秘程序员技术圈生存现状!

    [程序人生编者按]在迭代不休的技术圈中,仅在过去的一个月期间,我们见证了有史以来第一张黑洞照片的诞生:经历了为让人义愤填膺的 996:思考了作为程序员的年龄之槛:膜拜了技术大神的成长历程:追逐了如编程 ...

  8. IDEA个人常用配置记录

    原文 一.常用快捷键 编辑 ⇧ + ↩:开始新的一行 ⌘ + ⇧ + ↩:行内任意位置进行换行,并自动补齐“;”.“{}” ⌘ + ⇧ + U:大小写切换 ⌥ + ⌦:删除到单词的末尾(⌦键为Fn+D ...

  9. H5和原生APP之间的区别

    最近项目中因各种客观因素,移动端都是默认用的纯H5 APP,感受最深的就是各种坑啊,好大的坑啊.产品上线后,带着各种坑后的总结原因方发现很多人都说纯H5 APP一次编写就能支持android和IOS两 ...

  10. [Python]统计1个元素在列表中的出现次数

    使用列表自带的count方法: list.count(element) 示例:  列表a,有4个元素,其中值1出现3次 In []: a=[,,,] In []: a Out[]: [, , , ] ...