【loj3119】【CTS2019】随机立方体
题目
一个 $ n m l $ 的立方体等概率填入 $ 1-nml $ ;
定义一个位置是极大的当且仅当这个位置比三位坐标的至少一维与之相等的位置的值都大.
询问极大值恰好有\(k\)个的概率
$1 \le n,m,l \le 5000000 \ , \ 1 \le k \le 100 , 1 \le T \le 10 $
题解
由于平时不注意部分分所以CTS考得很难看,会改一改写博客的风格QAQ
二项式反演
\[\begin{align}
f_i = \sum_{j\le i}(^i_j)g_j \Leftrightarrow g_i = \sum_{j \le i}(-1)^{i-j}(^i_j)f_j
\\
f_i = \sum_{j\ge i} (^j_i)g_j \Leftrightarrow g_i=\sum_{j\ge i}(-1)^{j-i}(^j_i)f_j
\\
均可带入验证证明
\end{align}
\]10pts
直接打表即可
30pts
设\(dp_{i,j,a,b,c}\)表示从大到小填数填了\(i\)个,极大值有\(j\)个,在$ x,y,z \(坐标上占据了\) a,b,c $行;
复杂度:\(O(n^2m^2l^2min(n,m,l))\)
40pts
考虑统计先选好\(k\)个位置,最后的概率乘以一个\(\Pi_{j=0}^{k-1}(n-j)(m-j)(l-j)\)
选好的\(k\)个位置会形成\((n-k)(m-k)(l-1)\)个无关的位置和\(nml-(n-k)(m-k)(l-k)\)个有关位置
设\(dp_{i,j}\)表示已经选了\(j\)个极值点,其它点随意的方案
还是从大到小考虑,一个非极值点可以放的位置是所有无关位置和已经选过的极值点的有关位置的并
转移考虑每次一个点是不是极值点就可以了
最后套用二项式反演即可得到答案
复杂度:\(O(nmlmin(n,m,l))\)
100 pts
还是先硬点\(i\)个位置极大的概率之和\(f_i\),只需要考虑关键位置$ i \(个极值都成立的概率\)h_i$:
\[\begin{align}
a_i &= (n-i)(m-i)(l-i)\\
f_i &= \prod_{j=0}^{i-1}a_j \times h_i
\end{align}
\]直接从大到小考虑所有数是不独立的,不过第一个极大值大于前\(i\)个关键位置并的值和第二个极大值大于前\(i-1\)个关键位置并的值是独立的,所以
\[h_i = \prod_{j=1}^{i}\frac{1}{nml-a_j}
\]注意逆元的技巧即可,最后依旧二项式反演回来
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
const int N=5000010;
int T,n,m,l,k,f[N],h[N],a[N],A,tmp,fac[N],inv[N];
char gc(){
static char*p1,*p2,s[1000000];
if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=0;char c=gc();
while(c<'0'||c>'9')c=gc();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
return x;
}
int pw(int x,int y){
int re=1;
while(y){
if(y&1)re=(ll)re*x%mod;
y>>=1;x=(ll)x*x%mod;
}
return re;
}
void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
void dec(int&x,int y){x-=y;if(x<0)x+=mod;}
int C(int x,int y){return x<y?0:(ll)fac[x]*inv[y]%mod*inv[x-y]%mod;}
int cal(int x){return (ll)(n-x)*(m-x)%mod*(l-x)%mod;}
int main(){
// freopen("cube.in","r",stdin);
// freopen("cube.out","w",stdout);
T=rd();
for(int i=fac[0]=1;i<N;++i)fac[i]=(ll)fac[i-1]*i%mod;
inv[N-1]=pw(fac[N-1],mod-2);
for(int i=N-1;i;--i)inv[i-1]=(ll)inv[i]*i%mod;
while(T--){
n=rd();m=rd();l=rd();k=rd();
A=(ll)n*m%mod*l%mod;
tmp=min(min(n,m),l);
if(k>tmp){puts("0");continue;}
for(int i=a[0]=1;i<=tmp;++i)a[i]=(ll)a[i-1]*cal(i-1)%mod;
int mul=1;
for(int i=1;i<=tmp;++i)h[i]=(A-cal(i)+mod)%mod,mul=(ll)mul*h[i]%mod;
mul=pw(mul,mod-2);
for(int i=tmp;i;--i){
f[i]=(ll)a[i]*mul%mod;
mul=(ll)mul*h[i]%mod;
}
int ans=0;
for(int i=k;i<=tmp;++i)if((i-k)&1)dec(ans,(ll)C(i,k)*f[i]%mod);
else inc(ans,(ll)C(i,k)*f[i]%mod);
printf("%d\n",ans);
}
return 0;
}
【loj3119】【CTS2019】随机立方体的更多相关文章
- LOJ3119 CTS2019 随机立方体 概率、容斥、二项式反演
传送门 为了方便我们设\(N\)是\(N,M,L\)中的最小值,某一个位置\((x,y,z)\)所控制的位置为集合\(\{(a,b,c) \mid a = x \text{或} b = y \text ...
- 题解-CTS2019随机立方体
problem \(\mathtt {loj-3119}\) 题意概要:一个 \(n\times m\times l\) 的立方体,立方体中每个格子上都有一个数,如果某个格子上的数比三维坐标中至少有一 ...
- 【题解】Luogu P5400 [CTS2019]随机立方体
原题传送门 毒瘤计数题 我们设\(dp_i\)表示至少有\(i\)个极大数字的概率,\(ans_i\)表示恰好有\(i\)个极大数的概率,\(mi=Min(n,m,l)\) 易知: \[dp_i=\s ...
- [LOJ#3119][Luogu5400][CTS2019]随机立方体(容斥+DP)
https://www.cnblogs.com/cjyyb/p/10900993.html #include<cstdio> #include<algorithm> #defi ...
- Luogu5400 CTS2019随机立方体(容斥原理)
考虑容斥,计算至少有k个极大数的概率.不妨设这k个数对应的格子依次为(k,k,k)……(1,1,1).那么某一维坐标<=k的格子会对这些格子是否会成为极大数产生影响.先将这样的所有格子和一个数集 ...
- [CTS2019]随机立方体(容斥+组合数学)
这题七次方做法显然,但由于我太菜了,想了一会发现也就只会这么多,而且别的毫无头绪.发现直接做不行,那么,容斥! f[i]为至少i个极值的方案,然后这里需要一些辅助变量,a[i]表示选出i个三维坐标均不 ...
- 洛谷 P5400 - [CTS2019]随机立方体(组合数学+二项式反演)
洛谷题面传送门 二项式反演好题. 首先看到"恰好 \(k\) 个极大值点",我们可以套路地想到二项式反演,具体来说我们记 \(f_i\) 为钦定 \(i\) 个点为极大值点的方案数 ...
- 【CTS2019】随机立方体(容斥)
[CTS2019]随机立方体(容斥) 题面 LOJ 洛谷 题解 做这道题目的时候不难想到容斥的方面. 那么我们考虑怎么计算至少有\(k\)个极大值的方案数. 我们首先可以把\(k\)个极大值的位置给确 ...
- 「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...
随机推荐
- (1)ASP.NET Core 应用启动Startup类简介
1.前言 Core与早期版本的 ASP.NET 对比,配置应用程序的方式的 Global.asax.FilterConfig.cs和RouteConfig.cs 都被Program.cs 和 Star ...
- 阿里巴巴 Java 开发手册 (七) 控制语句
1. [强制]在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程 序将继续执行到哪一个 case 为止:在一个 switch 块内,都必须包含一个 ...
- 2-python元组和列表
目录 元组 列表 1.元组 - 元素有序排列 - 一个元组中的元素不需要具有相同的类型 - 元素不可增添.修改和删除 1.1.创建元组 # 创建元组 tup1 = (1,2,3,4) tup2 = t ...
- 2019-07-23 static 和 const 关键字的应用
首先先来了解下内存段,内存段共分为四个,栈.堆.代码段.初始化静态段.程序中不同的声明存放在不同的内存段内,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1, 10, 100 ...
- JQuery+Bootstrap 自定义全屏Loading插件
/** * 自定义Loading插件 * @param {Object} config * { * content[加载显示文本], * time[自动关闭等待时间(ms)] * } * @param ...
- Linux三剑客grep/sed/awk
grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...
- centos7 上Docker安装与启动
1. docker centos 文档地址 https://docs.docker.com/install/linux/docker-ce/centos/ 2. 安装环境说明: docker社区版 ...
- ffmpeg基础使用
https://www.jianshu.com/p/ddafe46827b7
- springboot2.1.3使用mvn site遇到的坑及解决方案
本人要使用mvn site命令生成一些项目报告,如:***.html文件,但是在命令运行时,时常报如下错误: 一开始还以为是 jar包冲突引起的,把相关依赖引用的jackson-module-scal ...
- linux内核模块编译makefile
linux内核可加载模块的makefile 在开发linux内核驱动时,免不了要接触到makefile的编写和修改,尽管网上的makefile模板一大堆,做一些简单的修改就能用到自己的项目上,但是,对 ...