考虑容斥,计算至少有k个极大数的概率。不妨设这k个数对应的格子依次为(k,k,k)……(1,1,1)。那么某一维坐标<=k的格子会对这些格子是否会成为极大数产生影响。先将这样的所有格子和一个数集对应起来,即将答案乘上一个组合数。然后需要考虑的就是这些格子有多少种合法排列顺序。

  这个排列需要满足的是(i,i,i)之前不能出现某一维坐标为i的格子。可以看做是填完(i,i,i)后,所有三维坐标中最小值为i的格子就可以填了。这样的格子数量容易计算。于是考虑将格子依次塞进排列,显然第一位只能放(k,k,k),然后所有三维坐标最小值为k的格子被解锁,用一个组合数将他们放在排列中任意位置,再继续放(k-1,k-1,k-1),以此类推。

  这样最后化一化得到一些东西,可以发现要计算的是一个数组前缀积的逆元。可以使用经典trick,求出整个数组积的逆元再倒序还原,即可做到线性。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define P 998244353
#define N 5000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int T,n,m,l,k,fac[N],inv[N],f[N],g[N];
int ksm(int a,int k)
{
int s=1;
for (;k;k>>=1,a=1ll*a*a%P) if (k&1) s=1ll*s*a%P;
return s;
}
int Inv(int a){return ksm(a,P-2);}
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int C(int n,int m){if (m>n) return 0;return 1ll*fac[n]*inv[m]%P*inv[n-m]%P;}
int A(int n,int m){if (m>n) return 0;return 1ll*fac[n]*inv[n-m]%P;}
int min(int x,int y,int z){return min(min(x,y),z);}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
T=read();
fac[0]=1;for (int i=1;i<=N-10;i++) fac[i]=1ll*fac[i-1]*i%P;
inv[0]=inv[1]=1;for (int i=2;i<=N-10;i++) inv[i]=P-1ll*(P/i)*inv[P%i]%P;
for (int i=2;i<=N-10;i++) inv[i]=1ll*inv[i]*inv[i-1]%P;
while (T--)
{
n=read(),m=read(),l=read(),k=read();
int ans=0;
for (int i=1;i<=min(n,m,l);i++) f[i]=(1ll*(n-i+1)*(m-i+1)%P*(l-i+1)%P-1ll*(n-i)*(m-i)%P*(l-i)%P+P)%P;
for (int i=1;i<=min(n,m,l);i++) f[i]=(f[i]+f[i-1])%P;g[min(n,m,l)]=1;
for (int i=1;i<=min(n,m,l);i++) g[min(n,m,l)]=1ll*g[min(n,m,l)]*f[i]%P;
g[min(n,m,l)]=Inv(g[min(n,m,l)]);
for (int i=min(n,m,l)-1;i>=1;i--) g[i]=1ll*g[i+1]*f[i+1]%P;
for (int i=k;i<=min(n,m,l);i++)
{
int waytochoosemax=1ll*A(n,i)*A(m,i)%P*A(l,i)%P;
if (i-k&1) inc(ans,P-1ll*C(i,k)*waytochoosemax%P*g[i]%P);
else inc(ans,1ll*C(i,k)*waytochoosemax%P*g[i]%P);
}
cout<<ans<<endl;
}
return 0;
}

  

Luogu5400 CTS2019随机立方体(容斥原理)的更多相关文章

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

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

  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. LOJ3119 CTS2019 随机立方体 概率、容斥、二项式反演

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 字节码(.class)文件的加载过程

    类加载 在Java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的. 类型可以是Class,Interface, 枚举等. Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机 ...

  2. kotlin单个文件及文件夹复制例子

    最近学习kotlin,把java中的单个文件及包含文件夹的文件 复制操作改写为kotlin的代码,主要熟悉kotlin文件操作以及递归调用操作方法 演示代码如下: package com.exam.f ...

  3. 泡泡一分钟:Aided Inertial Navigation: Unified Feature Representations and Observability Analysis

    http://udel.edu/~yuyang/downloads/tr_observabilityII.pdf Aided Inertial Navigation: Unified Feature R ...

  4. OpenLDAP配置坎坷路

    https://segmentfault.com/a/1190000014683418 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDA ...

  5. WINDOWS配置WSUS。

    wsus的注册表文件! Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindows ...

  6. AI佳作解读系列(五) - 目标检测二十年技术综述

    计算机视觉中的目标检测,因其在真实世界的大量应用需求,比如自动驾驶.视频监控.机器人视觉等,而被研究学者广泛关注.   上周四,arXiv新出一篇目标检测文献<Object Detection ...

  7. [ jenkins ] 基础安装及权限管理

    1. 安装 jenkins 在安装 jenkins 之前需要 java 的支持 (1)安装 jdk1.8 [root@192.168.118.17 ~]#tar xf jdk-8u77-linux-x ...

  8. Python第一阶段04

    1.文件操作: # 指明编码 f = open("sisi", encoding="utf-8") # 读 data = f.read() print(data ...

  9. elasticsearch in语句和not in语句

    sql语句示例: select * from table where t_id in (1,2,3,4) php代码示例: $search_query = [ "bool" =&g ...

  10. 【Leetcode_easy】1170. Compare Strings by Frequency of the Smallest Character

    problem 1170. Compare Strings by Frequency of the Smallest Character 参考 1. Leetcode_easy_1170. Compa ...