【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)\)钦定了一个极大数\( ...
随机推荐
- 分布式缓存重建并发冲突和zookeeper分布式锁解决方案
如果缓存服务在本地的ehcache中都读取不到数据. 这个时候就意味着,需要重新到源头的服务中去拉去数据,拉取到数据之后,赶紧先给nginx的请求返回,同时将数据写入ehcache和redis中 分布 ...
- 1.将控制器添加到 ASP.NET Core MVC 应用
模型-视图-控制器 (MVC) 体系结构模式将应用分成 3 个主要组件:模型 (M).视图 (V) 和控制器 (C). 模型(M):表示应用数据的类. 模型类使用验证逻辑来对该数据强制实施业务规则. ...
- Python的字符串函数
今天用了将近一天的时间去学习Python字符串函数 上午学了17个,下午学了23个(共计40) 详细内容请见菜鸟教程--Python3字符串--Python的字符串内建函数
- 在Windows中运行Linux bash命令的几种方法
如果你正在课程中正在学习 shell 脚本,那么需要使用 Linux 命令来练习命令和脚本. 你的学校实验室可能安装了 Linux,但是你自己没有安装了 Linux 的笔记本电脑,而是像其他人一样的 ...
- 【转载】C#中Convert.ToInt32方法将字符串转换为Int32类型
在C#编程过程中,可以使用Convert.ToInt32方法将字符串或者其他可转换为数字的对象变量转换为ToInt32类型,Convert.ToInt32方法有多个重载方法,最常使用的一个方法将字符串 ...
- Django:信号的使用
信号 Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 应用:比如插入数据到数据库,插入之前写日 ...
- 利用position absolute使div居中
外层DIV{position:realtive}内层DIV{positon:absolute;top:50%;left:50%;margin-top:-100px;margin-left:-150px ...
- mysql主从一致性校验工具-pt
一.环境 1.系统环境 系统 IP 主机名 说明 server_id centos6.7 MasterIP master 数据库:主 177 centos6.7 SlaveIP slave 数据库: ...
- jmeter bodydata参数传递
参见:接口测试, jmeter bodydata 传送的参数,在请求中显示为空 新增http header信息头:
- Termux和Ubuntu建立ssh连接
1 本机环境 Android:Termux v0.77 作为客户端 Linux:Ubuntu 19.10 作为服务器 两者处于同一局域网下 2 ssh安装 2.1 Termux pkg install ...