【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】TOPK最小的K个数(多种方法比较)
(头条) 最小的第K个数也是和这题topK一样的思路 1.全排序 时间复杂度O(nlogn) 2.Partiton思想 时间复杂度O(n) (因为不需要像快排一样对所有的分段都两两Partitio ...
- C ProcessAsUser
class Interop { public static void CreateProcess(string app, string path) { bool result; IntPtr hTok ...
- 反射之关于MethodInfo的使用
1.MethodInfo类是在System.Reflection命名空间底下,既然是在Reflection空间底下.故名思议关于反射相关的操作,其中比较重要的方法是Invoke()方法,它是加载相同程 ...
- 【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案
JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案 本文为转载,原文地址为:https://www.cnblogs.com/adversary/p/103 ...
- Java之路---Day11(接口)
2019-10-25-23:22:23 目录 1.接口的概念 2.接口的定义格式 3.接口包含的内容 4.接口的使用步骤 5.继承父类并实现多个接口 6.接口之间的多继承 接口的概念 接口是指对协定进 ...
- kali之使用sqlmap进行sql注入
sqlmap简介 sqlmap支持五种不同的注入模式: 1.基于布尔的盲注,即可以根据返回页面判断条件真假的注入. 2.基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是 ...
- 2019-07-25 php错误级别及设置方法
在php的开发过程里,我们总是会有一系列的错误警告,这些错误警告在我们开发的过程中是十分需要的,因为它能够提示我们在哪里出现了错误,以便修改和维护.但在网站开发结束投入使用时,这些报错我们就要尽量避免 ...
- python基础之猜数字游戏
#猜数字游戏 import random #impor语句导入random模块 guessor=0; print("#"*30) #输出30个”#“(”############## ...
- Firebird 事务隔离级别
各种RDBMS事务隔离都差不多,Firebird 中大致分为3类: CONCURRENCY.READ_COMMITTED.CONSISTENCY. 在提供的数据库驱动里可设置的事务隔离级别大致如下3类 ...
- HTTP协议学习总结
一个web应用程序,往往是通过http协议进行前后端通信的.而作为一个web工程师,掌握HTTP协议因此也是Web开发必备的一项技能了,尤其是在工作了一定年限之后,更是深感该知识点的重要性.因此,将以 ...