[LOJ3119][CTS2019|CTSC2019]随机立方体:组合数学+二项式反演
分析
感觉这道题的计数方法好厉害。。
一个直观的思路是,把题目转化为求至少有\(k\)个极大的数的概率。
考虑这样一个事实,如果钦定\((1,1,1),(2,2,2),...,(k,k,k)\)是那\(k\)个极大值的位置,并且\(val(1,1,1) < val(2,2,2) < ... < val(k,k,k)\)。我们考虑依次确定这些值,显然\(val(1,1,1)\)的值是和它至少有一维相同的\(n \times m \times l - (n-1) \times (m-1) \times (l-1)\)个位置中最大的一个,\(val(2,2,2)\)的值是和它至少有一维相同的所有位置并上\((1,1,1)\)限制到的所有位置中最大的一个,即\(n \times m \times l - (n-2) \times (m-2) \times (l-2)\)个位置中最大的一个。
以此类推,\(val(i,i,i)\)的值是\(n \times m \times l - (n-i) \times (m-i) \times (l-i)\)个位置中最大的一个。我们记\(cnt(i) = n \times m \times l - (n-i) \times (m-i) \times (l-i)\),进而可以得到\((i,i,i)\)是极大值的概率是\(P(i) = \frac{1}{cnt(i)}\)。
现在我们所需要的就是计算\(P(i)\)的前缀和,这个可以通过线性处理逆元的技巧完成,然后二项式反演,式子如下,其中\(A_n^m\)表示排列数:
\]
关于概率为什么能二项式反演?
可以这样理解:概率再乘上个阶乘就是方案数了。
yyb聚聚的题解
分析的方式不太一样,不过本质和最后得到的结果是相同的。
代码
#include <bits/stdc++.h>
#define rin(i,a,b) for(int i=(a);i<=(b);++i)
#define irin(i,a,b) for(int i=(a);i>=(b);--i)
#define trav(i,a) for(int i=head[a];i;i=e[i].nxt)
#define Size(a) (int) a.size()
#define pb push_back
#define mkpr std::make_pair
#define fi first
#define se second
#define lowbit(a) ((a)&(-(a)))
typedef long long LL;
using std::cerr;
using std::endl;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int MAXN=5000005;
const int MOD=998244353;
int n,m,l,k;
int fac[MAXN],invf[MAXN];
int cnt[MAXN],fix[MAXN];
inline int qpow(int x,int y){
int ret=1,tt=x%MOD;
while(y){
if(y&1)ret=1ll*ret*tt%MOD;
tt=1ll*tt*tt%MOD;
y>>=1;
}
return ret;
}
inline int C(int n,int m){
if(n<0||m<0||n<m)return 0;
return 1ll*fac[n]*invf[n-m]%MOD*invf[m]%MOD;
}
inline int A(int n,int m){
if(n<0||m<0||n<m)return 0;
return 1ll*fac[n]*invf[n-m]%MOD;
}
void init(int n){
fac[0]=1;
rin(i,1,n)fac[i]=1ll*fac[i-1]*i%MOD;
invf[n]=qpow(fac[n],MOD-2);
irin(i,n-1,0)invf[i]=1ll*invf[i+1]*(i+1)%MOD;
}
int main(){
init(5000000);
int T=read();
while(T--){
int inp[4];
rin(i,1,3)inp[i]=read();
std::sort(inp+1,inp+4);
n=inp[1],m=inp[2],l=inp[3];
k=read();
int tot=1;
rin(i,1,n){
cnt[i]=(1ll*n*m%MOD*l%MOD-1ll*(n-i)*(m-i)%MOD*(l-i)%MOD+MOD)%MOD;
tot=1ll*tot*cnt[i]%MOD;
}
fix[n]=qpow(tot,MOD-2);
irin(i,n-1,1)fix[i]=1ll*fix[i+1]*cnt[i+1]%MOD;
int ans=0,sgn=MOD-1;
rin(i,k,n){
sgn=MOD-sgn;
ans=(ans+1ll*sgn*C(i,k)%MOD*A(n,i)%MOD*A(m,i)%MOD*A(l,i)%MOD*fix[i])%MOD;
}
printf("%d\n",ans);
}
return 0;
}
[LOJ3119][CTS2019|CTSC2019]随机立方体:组合数学+二项式反演的更多相关文章
- 【CTS2019】随机立方体(容斥)
[CTS2019]随机立方体(容斥) 题面 LOJ 洛谷 题解 做这道题目的时候不难想到容斥的方面. 那么我们考虑怎么计算至少有\(k\)个极大值的方案数. 我们首先可以把\(k\)个极大值的位置给确 ...
- 洛谷 P5400 - [CTS2019]随机立方体(组合数学+二项式反演)
洛谷题面传送门 二项式反演好题. 首先看到"恰好 \(k\) 个极大值点",我们可以套路地想到二项式反演,具体来说我们记 \(f_i\) 为钦定 \(i\) 个点为极大值点的方案数 ...
- 【loj3119】【CTS2019】随机立方体
题目 一个 $ n m l $ 的立方体等概率填入 $ 1-nml $ ; 定义一个位置是极大的当且仅当这个位置比三位坐标的至少一维与之相等的位置的值都大. 询问极大值恰好有\(k\)个的 ...
- [LibreOJ 3119]【CTS2019】随机立方体【计数】【容斥】
Description Solution 记\(N=min(n,m,l)\) 首先考虑容斥,记\(f(i)\)为至少有i个位置是极大的,显然极大的位置数上界是N. 那么显然\(Ans=\sum\lim ...
- LOJ3119. 「CTS2019 | CTSC2019」随机立方体 二项式反演
题目传送门 https://loj.ac/problem/3119 现在 BZOJ 的管理员已经不干活了吗,CTS(C)2019 和 NOI2019 的题目到现在还没与传上去. 果然还是 LOJ 好. ...
- LOJ3119 CTS2019 随机立方体 概率、容斥、二项式反演
传送门 为了方便我们设\(N\)是\(N,M,L\)中的最小值,某一个位置\((x,y,z)\)所控制的位置为集合\(\{(a,b,c) \mid a = x \text{或} b = y \text ...
- 「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...
- LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体
题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...
- 题解-CTS2019随机立方体
problem \(\mathtt {loj-3119}\) 题意概要:一个 \(n\times m\times l\) 的立方体,立方体中每个格子上都有一个数,如果某个格子上的数比三维坐标中至少有一 ...
随机推荐
- 2017.10.28 C组比赛总结
这次比赛有点坑... [GDKOI2004]石子游戏 方法:判断奇偶性 输入n 如果n是奇数,输出 xiaoshi 如果n是偶数,输出 xiaoyong 比赛得分:30 错因:找错规律了(忘记了两个人 ...
- AppCan模拟器调试
来源: 1, 页面CSS调试 2, JS调试 3, 插件请打包后手机调试 4, 打开另一个页面示例: appcan.button("#myBtn", "ani-uct&q ...
- Hive 教程(二)-认知hive
在大数据领域,hive 的位置非常重要,排名前三的大数据工具为 spark.hive.kafka 什么是hive 在大数据领域有 3 种需求场景:传输.存储.计算: hive 是一个处理海量的结构化数 ...
- linux环境下tomcat启动成功,部分请求页面出现404
这种情况很多,本文记录我遇到比较奇葩的情况. 第一种情况: 第一次tomact启动成功,访问404,乱捣鼓不知怎么好了:第二次tomcat启动成功,可以访问部分链接,有些却报404,但是代码和数据都还 ...
- 浏览器行为:Form表单提交
1.form表单常用属性 1 2 3 4 action:url 地址,服务器接收表单数据的地址 method:提交服务器的http方法,一般为post和get name:最好好吃name属性的唯一性 ...
- 第一篇 HTML 认识HTML
认识HTML 学习一门语言,我们要先了解它,可以不用太资深,但要做到别人问,你能回答得出来! 注:推荐大家去网址:www.w3school.com.cn 前端学习手册(免费的) HTML(超文本标记语 ...
- Freemarker生成word文档的时的一些&,>,<报错
替换模板ftl中的内容的时候,一些特殊的字符需要转移,例如: &,<,> value为字符串 value.replace("&","& ...
- Java构造二叉树、树形结构先序遍历、中序遍历、后序遍历
package com.example.demo; public class BTree { public int data; public BTree left; public BTree rigt ...
- Dedecms 生成速度慢 的解决办法
从dedecms官网论坛找到个合适的代码 include/inc/inc_fun_SpGetArcList.php for($i=0;$i<$ridnum;$i++){ if($tpsql==& ...
- 从FBV到CBV一(开始)
span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...