考虑容斥,计算至少有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,求出整个数组积的逆元再倒序还原,即可做到线性。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define P 998244353
  5. #define N 5000010
  6. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  7. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  8. int read()
  9. {
  10. int x=0,f=1;char c=getchar();
  11. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  12. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  13. return x*f;
  14. }
  15. int T,n,m,l,k,fac[N],inv[N],f[N],g[N];
  16. int ksm(int a,int k)
  17. {
  18. int s=1;
  19. for (;k;k>>=1,a=1ll*a*a%P) if (k&1) s=1ll*s*a%P;
  20. return s;
  21. }
  22. int Inv(int a){return ksm(a,P-2);}
  23. void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
  24. int C(int n,int m){if (m>n) return 0;return 1ll*fac[n]*inv[m]%P*inv[n-m]%P;}
  25. int A(int n,int m){if (m>n) return 0;return 1ll*fac[n]*inv[n-m]%P;}
  26. int min(int x,int y,int z){return min(min(x,y),z);}
  27. int main()
  28. {
  29. #ifndef ONLINE_JUDGE
  30. freopen("a.in","r",stdin);
  31. freopen("a.out","w",stdout);
  32. const char LL[]="%I64d\n";
  33. #else
  34. const char LL[]="%lld\n";
  35. #endif
  36. T=read();
  37. fac[0]=1;for (int i=1;i<=N-10;i++) fac[i]=1ll*fac[i-1]*i%P;
  38. inv[0]=inv[1]=1;for (int i=2;i<=N-10;i++) inv[i]=P-1ll*(P/i)*inv[P%i]%P;
  39. for (int i=2;i<=N-10;i++) inv[i]=1ll*inv[i]*inv[i-1]%P;
  40. while (T--)
  41. {
  42. n=read(),m=read(),l=read(),k=read();
  43. int ans=0;
  44. 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;
  45. for (int i=1;i<=min(n,m,l);i++) f[i]=(f[i]+f[i-1])%P;g[min(n,m,l)]=1;
  46. for (int i=1;i<=min(n,m,l);i++) g[min(n,m,l)]=1ll*g[min(n,m,l)]*f[i]%P;
  47. g[min(n,m,l)]=Inv(g[min(n,m,l)]);
  48. for (int i=min(n,m,l)-1;i>=1;i--) g[i]=1ll*g[i+1]*f[i+1]%P;
  49. for (int i=k;i<=min(n,m,l);i++)
  50. {
  51. int waytochoosemax=1ll*A(n,i)*A(m,i)%P*A(l,i)%P;
  52. if (i-k&1) inc(ans,P-1ll*C(i,k)*waytochoosemax%P*g[i]%P);
  53. else inc(ans,1ll*C(i,k)*waytochoosemax%P*g[i]%P);
  54. }
  55. cout<<ans<<endl;
  56. }
  57. return 0;
  58. }

  

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. Linux中进程的几种状态

    linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态. 只有在该状 ...

  2. eclipse自定义代码块折叠

    1.下载插件 com.cb.eclipse.folding_1.0.6.jar 下载地址:http://files.cnblogs.com/haiq/代码折叠插件_com.cb.eclipse.fol ...

  3. springboot rabbitMQ 死信对列 实现消息的可靠消费

    1 引入 maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  4. 【转载】 我的Machine Learning学习之路

    原文地址: https://www.cnblogs.com/steven-yang/p/5857964.html ------------------------------------------- ...

  5. 按钮显示隐藏div、input等

    <script type="text/javascript"> function show() { var value = document.getElementByI ...

  6. WPF ChromiumWebBrowser 网页背景透明

    网页中添加下面样式即可: <style> html, body { margin: 0px; height: %; width: %; overflow: hidden; backgrou ...

  7. pls_integer类型

    转: pls_integer类型 2011-08-22 16:49:06 heqiyu34 阅读数 13413更多 分类专栏: Oracle   今天在看一个触发器代码的时候碰到了一个pls_inte ...

  8. Java Utils工具类大全

    源码和jar见:https://github.com/evil0ps/utils #Java Utils --- 封装了一些常用Java操作方法,便于重复开发利用. 另外希望身为Java牛牛的你们一起 ...

  9. 3D游戏引擎设计 实时计算机图形学的应用方法 第2版 pdf 带索引书签目录

    3D游戏引擎设计  实时计算机图形学的应用方法  第2版 目录 第1章 概述1.1 图形硬件和游戏发展史1.2 本书版本与软件发展史1.3 章节导读 第2章 图形系统2.1 基础知识2.1.1 坐标系 ...

  10. Spring Boot与ActiveMQ的集成

    Spring Boot对JMS(Java Message Service,Java消息服务)也提供了自动配置的支持,其主要支持的JMS实现有ActiveMQ.Artemis等.本节中,将以Active ...