「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\)个极大的位置的方案数,因为每次都是子问题,所以实际上很简单

\[f_i=\prod_{j=0}^{i-1}(n-j)(m-j)(l-j)
\]

设\(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}\)

于是我们可以得到

\[\begin{aligned}
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)!\)

然后我们带回去化简一下

\[\begin{aligned}
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\)个极大数的概率,那么

\[dp_i=f_i\prod_{j=1}^i\frac{1}{g_j}
\]

我们知道,如果\(a\times b=c\),那么可以有

\[a^{-1}\equiv c^{-1}b\pmod p
\]

有了这个,我们就可以线性求\(g\)的逆元了,这也是我们熟知的阶乘逆元的方法。

还有最后一步,设\(ans_i\)为恰好\(i\)个极大数的概率

设\(mi=\min(n,m,l)\)

我们有

\[dp_i=\sum_{j=i}^{mi}ans_j\binom{j}{i}
\]

由二项式反演可得

\[ans_i=\sum_{j=i}^{mi}dp_j\binom{j}{i}(-1)^{j-i}
\]


什么?你不会二项式反演?(其实我自己忘了就尝试推了一会儿,但我并不会比较感性理解的,只会一个推式子的)

\[A_i=\sum_{j=i}^n\binom{j}{i}B_j
\]

设\(\delta_{i,j}\)为满足

\[B_i=\sum_{j=i}^n\delta_{i,j}A_j
\]

的东西,考虑求出Ta

\[\begin{aligned}
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}
\]

可以得到,我们需要满足

\[\sum_{j=i}^k\delta_{i,j}\binom{k}{j}=[k=i]
\]

在优秀的莫比乌斯反演的某步证明中,我们用到了这个式子

\[\sum_{i=0}^n(-1)^i\binom{n}{i}=[n=0]
\]

证明方法很多,不说了

随便把这个式子变一变

\[\sum_{j=i}^k(-1)^{j-i}\binom{k-i}{k-j}=[k=i]
\]

那么我们可以得到

\[\delta_{i,j}\binom{k}{j}=(-1)^{j-i}\binom{k-i}{k-j}
\]

然后你解出来就可以了,但是我们平常写起来其实应该不是这样的

注意到一个组合式

\[\binom{k}{j}\binom{j}{i}=\binom{k}{i}\binom{k-i}{k-j}
\]

这个证明方法也多,你拆开或者组合意义理解都行

\[\binom{k}{i}\sum_{j=i}^k(-1)^{j-i}\binom{k-i}{k-j}=[k=i]
\]

就是把这个加到前面并不会影响什么

于是我们有

\[\delta_{i,j}=(-1)^{j-i}\binom{j}{i}
\]

综上

\[B_i=\sum_{j=i}^n(-1)^{j-i}\binom{j}{i}A_j
\]


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」随机立方体 解题报告的更多相关文章

  1. LOJ3119. 「CTS2019 | CTSC2019」随机立方体 二项式反演

    题目传送门 https://loj.ac/problem/3119 现在 BZOJ 的管理员已经不干活了吗,CTS(C)2019 和 NOI2019 的题目到现在还没与传上去. 果然还是 LOJ 好. ...

  2. LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体

    题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...

  3. LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)

    博客链接 里面有个下降幂应该是上升幂 还有个bk的式子省略了k^3 CODE 蛮短的 #include <bits/stdc++.h> using namespace std; const ...

  4. 【LOJ】#3119. 「CTS2019 | CTSC2019」随机立方体

    题解 用容斥,算至少K个极大值的方案数 我们先钦定每一维的K个数出来,然后再算上排列顺序是 \(w_{k} = \binom{n}{k}\binom{m}{k}\binom{l}{k}(k!)^3\) ...

  5. LOJ #3119. 「CTS2019 | CTSC2019」随机立方体 组合计数+二项式反演

    好神的一道计数题呀. code: #include <cstdio> #include <algorithm> #include <cstring> #define ...

  6. 「CTS2019 | CTSC2019」氪金手游 解题报告

    「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...

  7. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  8. 「THUSCH 2017」大魔法师 解题报告

    「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...

  9. loj3120 「CTS2019 | CTSC2019」珍珠

    link .... 感觉自己太颓废了....还是来更题解吧...[话说写博客会不会涨 rp 啊 qaq ? 题意: 有 n 个物品,每个都有一个 [1,D] 中随机的颜色,相同颜色的两个物品可以配对. ...

随机推荐

  1. Anaconda基本命令

    创建环境 conda create --name bunnies python=3 astroid babel 列出所有环境 conda info --envs 或 conda env list 克隆 ...

  2. makefile 中的patsubst

    1. wildcard:扩展通配符 2. notdir:去除路径 3. patsubst:替换通配符 若有一个makefile如下: src=$(wildcard *.c ./sub/*.c) dir ...

  3. java-特殊字符转义转换

    常见特殊字符:如下 <>…&—\"·‘’ java替换 /* * 特殊字符转换 */ public static String replacesss(String ss) ...

  4. 【Flutter学习】页面跳转之路由及导航

    一,概述 移动应用通常通过成为‘屏幕’或者‘页面’的全屏元素显示其内容,在Flutter中,这些元素统称为路由,它们由导航器Navigator组件管理.导航器管理一组路由Route对象,并提供了管理堆 ...

  5. nginx 全面优化 负载均衡

    修改nginx.conf文件,它保存有nginx不同模块的全部设置.如果是原生安装的话应该在服务器的 /etc/nginx 目录找到 nginx.conf ,使用其它安装包的话也可以自行查找nginx ...

  6. (转)Android Studio解决unspecified on project app resolves to an APK archive which is not supported

    出现该问题unspecified on project app resolves to an APK archive which is not supported as a compilation d ...

  7. dotnet core项目的nuget存储路径

    Where's the package location in aspnet core For project.json the nuget directory is in the user prof ...

  8. Objective-C UIWebview JS 交互

    一.在OC中调用网页中的 js 方法. Objective-C 代码 [self.webView stringByEvaluatingJavaScriptFromString:@"alert ...

  9. 转载! 一图读懂 SignalR

  10. angular5 清除定时器

    ngOnDestroy 在指令被销毁前,将会调用 ngOnDestory 方法.它主要用于执行一些清理操作,比如:移除事件监听.清除定时器.退订 Observable 等. 调用方法 1. impor ...