分析

感觉这道题的计数方法好厉害。。

一个直观的思路是,把题目转化为求至少有\(k\)个极大的数的概率。

考虑这样一个事实,如果钦定\((1,1,1),(2,2,2),...,(k,k,k)\)是那\(k\)个极大值的位置,并且\(val(1,1,1) < val(2,2,2) < ... < val(k,k,k)\)。我们考虑依次确定这些值,显然\(val(1,1,1)\)的值是和它至少有一维相同的\(n \times m \times l - (n-1) \times (m-1) \times (l-1)\)个位置中最大的一个,\(val(2,2,2)\)的值是和它至少有一维相同的所有位置并上\((1,1,1)\)限制到的所有位置中最大的一个,即\(n \times m \times l - (n-2) \times (m-2) \times (l-2)\)个位置中最大的一个。

以此类推,\(val(i,i,i)\)的值是\(n \times m \times l - (n-i) \times (m-i) \times (l-i)\)个位置中最大的一个。我们记\(cnt(i) = n \times m \times l - (n-i) \times (m-i) \times (l-i)\),进而可以得到\((i,i,i)\)是极大值的概率是\(P(i) = \frac{1}{cnt(i)}\)。

现在我们所需要的就是计算\(P(i)\)的前缀和,这个可以通过线性处理逆元的技巧完成,然后二项式反演,式子如下,其中\(A_n^m\)表示排列数:

\[ans = \sum_{i=k}^{n}(-1)^{i-k}\binom{i}{k}A_n^iA_m^iA_l^i\prod_{j=1}^{i}P(j)
\]

关于概率为什么能二项式反演?

可以这样理解:概率再乘上个阶乘就是方案数了。

yyb聚聚的题解

戳这里

分析的方式不太一样,不过本质和最后得到的结果是相同的。

代码

  1. #include <bits/stdc++.h>
  2. #define rin(i,a,b) for(int i=(a);i<=(b);++i)
  3. #define irin(i,a,b) for(int i=(a);i>=(b);--i)
  4. #define trav(i,a) for(int i=head[a];i;i=e[i].nxt)
  5. #define Size(a) (int) a.size()
  6. #define pb push_back
  7. #define mkpr std::make_pair
  8. #define fi first
  9. #define se second
  10. #define lowbit(a) ((a)&(-(a)))
  11. typedef long long LL;
  12. using std::cerr;
  13. using std::endl;
  14. inline int read(){
  15. int x=0,f=1;char ch=getchar();
  16. while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
  17. while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
  18. return x*f;
  19. }
  20. const int MAXN=5000005;
  21. const int MOD=998244353;
  22. int n,m,l,k;
  23. int fac[MAXN],invf[MAXN];
  24. int cnt[MAXN],fix[MAXN];
  25. inline int qpow(int x,int y){
  26. int ret=1,tt=x%MOD;
  27. while(y){
  28. if(y&1)ret=1ll*ret*tt%MOD;
  29. tt=1ll*tt*tt%MOD;
  30. y>>=1;
  31. }
  32. return ret;
  33. }
  34. inline int C(int n,int m){
  35. if(n<0||m<0||n<m)return 0;
  36. return 1ll*fac[n]*invf[n-m]%MOD*invf[m]%MOD;
  37. }
  38. inline int A(int n,int m){
  39. if(n<0||m<0||n<m)return 0;
  40. return 1ll*fac[n]*invf[n-m]%MOD;
  41. }
  42. void init(int n){
  43. fac[0]=1;
  44. rin(i,1,n)fac[i]=1ll*fac[i-1]*i%MOD;
  45. invf[n]=qpow(fac[n],MOD-2);
  46. irin(i,n-1,0)invf[i]=1ll*invf[i+1]*(i+1)%MOD;
  47. }
  48. int main(){
  49. init(5000000);
  50. int T=read();
  51. while(T--){
  52. int inp[4];
  53. rin(i,1,3)inp[i]=read();
  54. std::sort(inp+1,inp+4);
  55. n=inp[1],m=inp[2],l=inp[3];
  56. k=read();
  57. int tot=1;
  58. rin(i,1,n){
  59. cnt[i]=(1ll*n*m%MOD*l%MOD-1ll*(n-i)*(m-i)%MOD*(l-i)%MOD+MOD)%MOD;
  60. tot=1ll*tot*cnt[i]%MOD;
  61. }
  62. fix[n]=qpow(tot,MOD-2);
  63. irin(i,n-1,1)fix[i]=1ll*fix[i+1]*cnt[i+1]%MOD;
  64. int ans=0,sgn=MOD-1;
  65. rin(i,k,n){
  66. sgn=MOD-sgn;
  67. ans=(ans+1ll*sgn*C(i,k)%MOD*A(n,i)%MOD*A(m,i)%MOD*A(l,i)%MOD*fix[i])%MOD;
  68. }
  69. printf("%d\n",ans);
  70. }
  71. return 0;
  72. }

[LOJ3119][CTS2019|CTSC2019]随机立方体:组合数学+二项式反演的更多相关文章

  1. 【CTS2019】随机立方体(容斥)

    [CTS2019]随机立方体(容斥) 题面 LOJ 洛谷 题解 做这道题目的时候不难想到容斥的方面. 那么我们考虑怎么计算至少有\(k\)个极大值的方案数. 我们首先可以把\(k\)个极大值的位置给确 ...

  2. 洛谷 P5400 - [CTS2019]随机立方体(组合数学+二项式反演)

    洛谷题面传送门 二项式反演好题. 首先看到"恰好 \(k\) 个极大值点",我们可以套路地想到二项式反演,具体来说我们记 \(f_i\) 为钦定 \(i\) 个点为极大值点的方案数 ...

  3. 【loj3119】【CTS2019】随机立方体

    题目 ​ 一个 $ n m l $ 的立方体等概率填入 $ 1-nml $ ; ​ 定义一个位置是极大的当且仅当这个位置比三位坐标的至少一维与之相等的位置的值都大. ​ 询问极大值恰好有\(k\)个的 ...

  4. [LibreOJ 3119]【CTS2019】随机立方体【计数】【容斥】

    Description Solution 记\(N=min(n,m,l)\) 首先考虑容斥,记\(f(i)\)为至少有i个位置是极大的,显然极大的位置数上界是N. 那么显然\(Ans=\sum\lim ...

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

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

  6. LOJ3119 CTS2019 随机立方体 概率、容斥、二项式反演

    传送门 为了方便我们设\(N\)是\(N,M,L\)中的最小值,某一个位置\((x,y,z)\)所控制的位置为集合\(\{(a,b,c) \mid a = x \text{或} b = y \text ...

  7. 「CTS2019 | CTSC2019」随机立方体 解题报告

    「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...

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

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

  9. 题解-CTS2019随机立方体

    problem \(\mathtt {loj-3119}\) 题意概要:一个 \(n\times m\times l\) 的立方体,立方体中每个格子上都有一个数,如果某个格子上的数比三维坐标中至少有一 ...

随机推荐

  1. LOJ526「LibreOJ β Round #4」子集

    题目 算是比较裸的题吧. 首先我们把符合要求的\((i,j)\)建一条边,那么我们要求的就是最大团. 转化为补图的最小独立集. 然后我们来证明补图是一个二分图. \((u,v)\)有边\(\Leftr ...

  2. POJ - 1149 PIGS (建图思维+最大流)

    (点击查看原题) 题目分析 (以下均为 Edelweiss 大佬的思路,博主承认自己写不了这么好,但是学习的心促使我记录下这个好题的写法,所以代码是我写的) [题目大意] 有 M 个猪圈,每个猪圈里初 ...

  3. Java后端技术面试汇总(第四套)

    1.Java基础 • 为什么JVM调优经常会将-Xms和-Xmx参数设置成一样:• Java线程池的核心属性以及处理流程:• Java内存模型,方法区存什么:• CMS垃圾回收过程:• Full GC ...

  4. NIO、BIO、AIO

    BIO(同步阻塞):Socket编程就是 BIO ,操作时会阻塞线程,并发处理能力低 .阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的 ...

  5. 第四篇 jQuery中的事件与应用

    4.1 事件中的冒泡现象,ready()方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...

  6. SQL----Group By and Having

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...

  7. 02 前端之css

    ---恢复内容开始--- 1.css的几种引入方式: 1.行内样式 (行内式是在标记的style属性中设定的css样式.不推荐大规模使用) <p style="color: red&q ...

  8. This application has no explicit mapping for /error, so you are seeing this as a fallback.

    检查url是否输入正确,要加上之前的mapping映射

  9. Python内置函数清单

    作者:Vamei 出处:http://www.cnblogs.com/vamei Python内置(built-in)函数随着python解释器的运行而创建.在Python的程序中,你可以随时调用这些 ...

  10. dedecms sql 替换 或 删除

    UPDATE dede_archives SET writer='你需要修改的作者' WHERE writer=''; UPDATE dede_archives SET source='你需要修改的来 ...