题目

​ 一个 $ 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】随机立方体的更多相关文章

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

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

  2. 题解-CTS2019随机立方体

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

  3. 【题解】Luogu P5400 [CTS2019]随机立方体

    原题传送门 毒瘤计数题 我们设\(dp_i\)表示至少有\(i\)个极大数字的概率,\(ans_i\)表示恰好有\(i\)个极大数的概率,\(mi=Min(n,m,l)\) 易知: \[dp_i=\s ...

  4. [LOJ#3119][Luogu5400][CTS2019]随机立方体(容斥+DP)

    https://www.cnblogs.com/cjyyb/p/10900993.html #include<cstdio> #include<algorithm> #defi ...

  5. Luogu5400 CTS2019随机立方体(容斥原理)

    考虑容斥,计算至少有k个极大数的概率.不妨设这k个数对应的格子依次为(k,k,k)……(1,1,1).那么某一维坐标<=k的格子会对这些格子是否会成为极大数产生影响.先将这样的所有格子和一个数集 ...

  6. [CTS2019]随机立方体(容斥+组合数学)

    这题七次方做法显然,但由于我太菜了,想了一会发现也就只会这么多,而且别的毫无头绪.发现直接做不行,那么,容斥! f[i]为至少i个极值的方案,然后这里需要一些辅助变量,a[i]表示选出i个三维坐标均不 ...

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

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

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

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

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

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

随机推荐

  1. 打印从1到n位数的最大值

    题目: 输入数字n,按顺序打印从1到最大的n位十进制数,如输入3,则打印从1.2.3一直到最大的3位数999 参考大数运算的方法.考虑到位数会很大,所以采用字符串的形式解决.对输入的n,创建一个长度为 ...

  2. IDEA设置虚拟机参数

    第一步:打开“Run->Edit Configurations”菜单 第二步:选择“VM Options”选项,输入你要设置的VM参数 第三步:点击“OK”.“Apply”后设置完成

  3. php中的htmlspecialchars_decode()函数

    htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符. <?php $str = "This is some <b>bold&l ...

  4. drf中的各种view,viewset

    drf中的各种view,viewset Django REST framework里有各种各样的view,让我有点蒙,得好好捋一捋这关系. 视图的作用 Django用"视图"这个概 ...

  5. 未能加载文件或程序集 Microsoft.ReportViewer.ProcessingObjectModel, Version=10.0.0.0

    写在前面 整理错误集.某一天在启动项目的时候,出现了未能加载文件或程序集 Microsoft.ReportViewer.ProcessingObjectModel, Version=10.0.0.0错 ...

  6. Spring Boot后端与Angular前端进行timestamp的交互

    后端使用java.sql.Timestamp 后端vo字段类型使用 import java.sql.Timestamp; Mapper可以为字段加上属性jdbcType="TIMESTAMP ...

  7. Linux 软链接和硬链接简介

    在Linux系统中,将文件分为两个部分:用户数据和元数据. 元数据(inode) 元数据即文件的索引节点(inode),用来记录文件的权限(r.w.x).文件的所有者和属组.文件的大小.文件的状态改变 ...

  8. 一 python并发编程之多进程

    一 进程与程序 二 并发与并行 三 同步\异步和阻塞\非阻塞 四 进程的创建 五 进程的终止 六 进程的层次结构 七 进程的状态 八 进程并发的实现 一 进程与程序 什么是进程: 进程的概念:我们知道 ...

  9. Audio Queue Services Programming Guide(音频队列服务编程指南)

    Audio Queue Services 的苹果官方文档: https://developer.apple.com/library/ios/documentation/MusicAudio/Conce ...

  10. PHP java时间戳转php时间戳

    /** * java时间戳转php时间戳 * @param int $javaUt java的时间戳 * @return int * @Date 2019/8/26 */ public static ...