Description



Solution

记\(N=min(n,m,l)\)

首先考虑容斥,记\(f(i)\)为至少有i个位置是极大的,显然极大的位置数上界是N。

那么显然\(Ans=\sum\limits_{i=k}^{N}(-1)^{i-k}f(i){i \choose k}\)

现在来计算\(f\)

我们考虑立方体中哪些位置是极大的,显然这些极大的位置三维坐标都互不相同,然后剩下的怎么选概率都是一样的。

将这i个位置按值从小到大排起来,那么有序的选出\(i\)个位置的方案数就是\(n^{i\downarrow}m^{i\downarrow}l^{i\downarrow}\),下降箭头表示下降幂。

然后这些位置都必须是这些坐标中最大的。记\(S_j\)为与第j个位置有坐标相同的点集。

如果直接对于每一个位置j计算它是\(S_j\)中最大的点的概率,然后再全部乘在一起,这是不正确的,因为\(S\)之间可能有交,即使排除了交的部分,概率仍然是不独立的。

但是我们注意到位置已经按照小到大排了,因此\(a_2>a_1\geq S_1,a_2\geq S_2\),因此一定满足\(a_2\geq S_1\cup S_2,a_3\geq S_1\cup S_2 \cup S_3......\)

可以发现,这样每个位置是极大的概率就独立了。

因此\(f(k)=n^{k\downarrow}m^{k\downarrow}l^{k\downarrow}\sum\limits_{j=1}^{k}{1\over nml-(n-j)(m-j)(l-j)}\)

预处理n个数的逆元可以用前缀积做到\(O(n+\log)\),因此总的时间复杂度就是\(O(tN)\)的

Code

#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
#define N 5000005
#define LL long long
#define mo 998244353
using namespace std;
LL js[N],ny[N],d[N],nd[N],ds[N];
LL ksm(LL k,LL n)
{
LL s=1;
for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;
return s;
}
LL C(int n,int m)
{
if(n<m) return 0;
return js[n]*ny[m]%mo*ny[n-m]%mo;
}
LL n,m,l,r,n1;
int main()
{
int t;
cin>>t;
js[0]=1;
fo(i,1,N-5) js[i]=js[i-1]*(LL)i%mo;
ny[N-5]=ksm(js[N-5],mo-2);
fod(i,N-6,0) ny[i]=ny[i+1]*(LL)(i+1)%mo;
while(t--)
{
cin>>n>>m>>l>>r;
n1=min(n,min(m,l));
LL v=1,ans=0,s=1,np=n*m%mo*l%mo;
ds[0]=1;
fo(i,1,n1)
{
d[i]=(np-(n-i)*(m-i)%mo*(l-i)%mo+mo)%mo;
ds[i]=ds[i-1]*d[i]%mo;
}
nd[n1]=ksm(ds[n1],mo-2);
fod(i,n1-1,0) nd[i]=nd[i+1]*d[i+1]%mo;
fo(i,1,n1)
{
s=s*(n-i+1)%mo*(m-i+1)%mo*(l-i+1)%mo;
s=s*nd[i]%mo*ds[i-1]%mo;
if(i>=r)
{
ans=(ans+s*v%mo*C(i,r)%mo)%mo;
v=mo-v;
}
}
printf("%lld\n",ans);
}
}

[LibreOJ 3119]【CTS2019】随机立方体【计数】【容斥】的更多相关文章

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

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

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

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

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

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

  4. bzoj 2839 集合计数 容斥\广义容斥

    LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...

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

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

  6. 题解-CTS2019随机立方体

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

  7. bzoj2839: 集合计数 容斥+组合

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 523  Solved: 287[Submit][Status][Discuss] ...

  8. BZOJ2839:集合计数(容斥,组合数学)

    Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...

  9. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

  10. BZOJ 3294: [Cqoi2011]放棋子 计数 + 容斥 + 组合

    比较头疼的计数题. 我们发现,放置一个棋子会使得该棋子所在的1个行和1个列都只能放同种棋子. 定义状态 $f_{i,j,k}$ 表示目前已使用了 $i$ 个行,$j$ 个列,并放置了前 $k$ 种棋子 ...

随机推荐

  1. 建立分表sql执行语句批量生成工具(自创)

    public void addTable (){ String add=""; for(int i=1;i<13;i++){      for(int j=0;j<60 ...

  2. C++学习 之 继承方式(笔记)

    1.继承方式的分类 继承方式有公有继承,私有继承,保护继承.不同之处在于指定派生类的基类时使用的关键字不同:公有继承使用关键字public,私有继承使用关键字private,保护继承使用关键字prot ...

  3. Django之自定义标签,过滤器,以及inclusion_tag

    目录 Django之自定义标签,过滤器,以及inclusion_tag 自定义过滤器 自定义标签 inclusion_tag inclusion_tag() 项目实例: inclusion_tag() ...

  4. Linux小知识:sudo su和su的区别

    Linux小知识:sudo su和su的区别 本文是学习笔记,视频地址:https://www.bilibili.com/video/av62836363 su是申请切换root用户,需要申请root ...

  5. 将数据导出到 excel ,然后下载下来

    private static final String SHEET_NAME = "培养计划表"; /** * @param response * @param trainingN ...

  6. 借用jquery实现:使浏览器的“前进”按钮功能失效

    我借用jquery实现了这种效果,但并没有禁用掉浏览器本身的“前进”按钮,以下是代码,希望有用的朋友借鉴以下: $(function () { jQuery(window).bind("un ...

  7. 享元模式<Flyweight Pattern>

    1.What-是什么?   享元模式是一种轻量级的结构型模式.旨在以共享的方式高效的支持大量的细粒度对象的复用.要求能够共享的对象必须是细粒度对象,这些对象比较相似,状态变化小. 2.Why-为什么? ...

  8. MySQL字段值按照拼音首字母排序

    最简单.快速的方法: 将需要进行排序的字段编码设置为GBK,然后在查询时直接使用asc/desc就可以啦

  9. CRM项目讲解和django知识点回顾

    今天想把之前写的CRM项目梳理下,顺便回顾一下djiango的部分重要知识. 1.登录页面(包含简单验证码) 首先来看下CRM的登录页面,样式啥的不重要,大家可以去jquery ui的网站上或者其他地 ...

  10. Python之路:进程、线程

    目录 一.进程与线程区别 1.1 什么是线程 1.2 什么是进程 1.3 进程与线程的区别 二.Python GIL全局解释器锁 三.线程 3.1 threading模块 3.2 Join & ...