「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体
据说这是签到题,但是我计数学的实在有点差,这里认真说一说。
我们先考虑一些事实
- 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\(p\),那么我们需要把\(x=x_0\),\(y=y_0\)与\(z=z_0\)的三个平面的交中填上比\(p\)小的数字,这样,剩下的正方体就成了一个长宽高分别为\((n-1)(m-1)(l-1)\)的子问题了。
- 考虑到我们使用的是数字的相对大小关系,而不是数字的值,也就是说,任意的\(k\)个数字,发挥的作用是完全一样的,他们互不相同。
以上两个事实都可以启发我们往容斥的方向想,考虑容斥。
设\(dp_i\)为至少有\(i\)个极大数字的方案数,然后我们进行钦定。
\(dp_i\)等于(钦定\(i\)个极大数的位置方案数)\(\times\)(极大数删去平面的交的填充方案数)\(\times\)(剩下随意发挥的剩余正方体填充方案数)
首先我们需要把所有的数字分成两部分,删去的平面交与剩余的正方体。
这里设\(N=n\times m\times l\),\(g_i\)为钦定\(i\)个极大值后删去平面交的方块数,那么这个数字的划分方案数就是\(\binom{N}{g_i}\)
\(g_i\)的表达式也很简单,\(g_i=nml-(n-i)(m-i)(l-i)\)
然后挨个考虑\(dp\)的组成成分,设\(f_i\)等于钦定\(i\)个极大的位置的方案数,因为每次都是子问题,所以实际上很简单
\]
设\(h_i\)表示删去的平面交的填充方案数,可以发现,这个东西一下子求不来,可以考虑一下递推的方法。
我们再考虑一个事实
- 如果先钦定了\(x\),然后删去了相关平面,再钦定\(y\),如果我们想让删去的平面中的填充不影响\(y\),我们需要满足条件\(x<y\)
这启发我们先进行数值大的外面的填充
我们先把\(g_i\)个数中最大的数值拿出来,填到对应位置,然后剩下的\(g_i-g_{i-1}+1\)个位置(就是第\(i\)次删去的平面),每个位置可以随便选择一个数,方案数为\(\frac{(g_i-1)!}{g_{i-1}!}\),然后我们可以发现,剩下的数的填充就是子问题\(h_{i-1}\)
于是我们可以得到
h_i&=\frac{(g_i-1)!}{g_{i-1}!}\times h_{i-1}\\
&=\prod_{j=0}^{i-1}\frac{(g_{j+1}-1)!}{g_j!}
\end{aligned}
\]
最后面随意填充就简单了就是\((N-g_i)!\)
然后我们带回去化简一下
dp_i&=\binom{N}{g_i}f_ih_i(N-g_i)!\\
&=N!f_i\prod_{j=1}^{i}(g_j-1)!\prod_{j=0}^{i}\frac{1}{g_j!}\\
&=N!f_i\prod_{j=1}^{i}\frac{1}{g_j}
\end{aligned}
\]
我们现在求的是方案数,但题意是概率。所以这个\(N!\)其实直接扔了就好。
令\(dp_i\)代表至少\(i\)个极大数的概率,那么
\]
我们知道,如果\(a\times b=c\),那么可以有
\]
有了这个,我们就可以线性求\(g\)的逆元了,这也是我们熟知的阶乘逆元的方法。
还有最后一步,设\(ans_i\)为恰好\(i\)个极大数的概率
设\(mi=\min(n,m,l)\)
我们有
\]
由二项式反演可得
\]
什么?你不会二项式反演?(其实我自己忘了就尝试推了一会儿,但我并不会比较感性理解的,只会一个推式子的)
若
\]
设\(\delta_{i,j}\)为满足
\]
的东西,考虑求出Ta
B_i&=\sum_{j=i}^n\delta_{i,j}A_j\\
&=\sum_{j=i}^n\delta_{i,j}\sum_{k=j}^n\binom{k}{j}B_k\\
&=\sum_{k=i}^nB_k\sum_{j=i}^k\delta_{i,j}\binom{k}{j}
\end{aligned}
\]
可以得到,我们需要满足
\]
在优秀的莫比乌斯反演的某步证明中,我们用到了这个式子
\]
证明方法很多,不说了
随便把这个式子变一变
\]
那么我们可以得到
\]
然后你解出来就可以了,但是我们平常写起来其实应该不是这样的
注意到一个组合式
\]
这个证明方法也多,你拆开或者组合意义理解都行
而
\]
就是把这个加到前面并不会影响什么
于是我们有
\]
综上
\]
Code:
#include <cstdio>
#include <cctype>
#include <algorithm>
using std::min;
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{
x=0;char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
}
const int mod=998244353;
int inline add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
#define mul(x,y) (1ll*(x)*(y)%mod)
int qp(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;}
const int N=5e6+1;
int fac[N],inv[N],dp[N],f[N],g[N],invg[N],yuy[N];
int C(int m,int n){return mul(mul(fac[m],inv[n]),inv[m-n]);}
int main()
{
fac[0]=1;for(int i=1;i<N;i++) fac[i]=mul(fac[i-1],i);
inv[N-1]=qp(fac[N-1],mod-2);
for(int i=N-2;~i;i--) inv[i]=mul(inv[i+1],i+1);
int T,n,m,l,k;read(T);
while(T--)
{
read(n),read(m),read(l),read(k);
int mi=min(n,min(m,l));
if(k>mi)
{
puts("0");
continue;
}
f[0]=1;
for(int i=0;i<mi;i++) f[i+1]=mul(f[i],yuy[i]=mul(n-i,mul(m-i,l-i)));
int fg=1,tot=yuy[0];
yuy[mi]=0;
for(int i=1;i<=mi;i++)
{
g[i]=add(tot,mod-yuy[i]);
fg=mul(fg,g[i]);
}
invg[mi]=qp(fg,mod-2);
for(int i=mi-1;~i;i--) invg[i]=mul(invg[i+1],g[i+1]);
for(int i=1;i<=mi;i++) dp[i]=mul(f[i],invg[i]);
int ans=0;
for(int i=k;i<=mi;i++)
{
if(i-k&1) ans=add(ans,mod-mul(C(i,k),dp[i]));
else ans=add(ans,mul(C(i,k),dp[i]));
}
printf("%d\n",ans);
}
return 0;
}
2019.5.20
「CTS2019 | CTSC2019」随机立方体 解题报告的更多相关文章
- LOJ3119. 「CTS2019 | CTSC2019」随机立方体 二项式反演
题目传送门 https://loj.ac/problem/3119 现在 BZOJ 的管理员已经不干活了吗,CTS(C)2019 和 NOI2019 的题目到现在还没与传上去. 果然还是 LOJ 好. ...
- LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体
题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...
- LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)
博客链接 里面有个下降幂应该是上升幂 还有个bk的式子省略了k^3 CODE 蛮短的 #include <bits/stdc++.h> using namespace std; const ...
- 【LOJ】#3119. 「CTS2019 | CTSC2019」随机立方体
题解 用容斥,算至少K个极大值的方案数 我们先钦定每一维的K个数出来,然后再算上排列顺序是 \(w_{k} = \binom{n}{k}\binom{m}{k}\binom{l}{k}(k!)^3\) ...
- LOJ #3119. 「CTS2019 | CTSC2019」随机立方体 组合计数+二项式反演
好神的一道计数题呀. code: #include <cstdio> #include <algorithm> #include <cstring> #define ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- 「THUSCH 2017」大魔法师 解题报告
「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...
- loj3120 「CTS2019 | CTSC2019」珍珠
link .... 感觉自己太颓废了....还是来更题解吧...[话说写博客会不会涨 rp 啊 qaq ? 题意: 有 n 个物品,每个都有一个 [1,D] 中随机的颜色,相同颜色的两个物品可以配对. ...
随机推荐
- js浮点解决
function add(a, b) { var c, d, e; try { c = a.toString().split(".")[1].length; } catch (f) ...
- AI加持的阿里云飞天大数据平台技术揭秘
摘要:2019云栖大会大数据&AI专场,阿里云智能计算平台事业部研究员关涛.资深专家徐晟来为我们分享<AI加持的阿里云飞天大数据平台技术揭秘>.本文主要讲了三大部分,一是原创技术优 ...
- Database基础(三):SQL数据导入/导出、 操作表记录、查询及匹配条件
一.SQL数据导入/导出 目标: 使用SQL语句完成下列导出.导入操作: 将/etc/passwd文件导入userdb库userlist表并给每条记录加编号 将userdb库userlist表中UID ...
- Sqli labs系列-less-5&6 报错注入法(上)
在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是看了源码的.... 基于报错注入的方法,我早就忘的差不多了,,,我记的我最后一次基于 ...
- mysql全家桶(四)存储过程
一.存储过程1.介绍简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法: 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以 ...
- tomcat7以下线程控制
web server允许的最大线程连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右. 1.编辑tomcat安装目录下的conf目录下的server. ...
- MySQL replace 和 replace into 的用法
mysql replace实例说明: UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); REPLACE(str,from_str,to_str) 在字符串 st ...
- 运维 03 Linux之文档与目录结构
Linux之文档与目录结构 Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到 ...
- Linux应急响应基础
文件排查 敏感目录文件分析 tmp目录 命令目录 /usr/bin /usr/sbin 开机启动项 /etc/init.d /etc/init.d是/etc/rc.d/init.d的软链接 文件时间 ...
- Linux(一)—— Linux环境搭建
Linux环境搭建 一.虚拟机安装 1.下载地址 https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmwar ...