P5400-[CTS2019]随机立方体【二项式反演,计数】

正题

题目链接:https://www.luogu.com.cn/problem/P5400


题目大意

有一个n×m×ln\times m\times ln×m×l的三维网格,要在每个格子处填上一个数,要求填的数中1∼n×m×l1\sim n\times m\times l1n×m×l都恰好出现了一次。

一个极大值被定义为这个格子比其他与它至少有一个坐标相同的格子都大,求恰好有kkk个极大值的概率。

1≤n,m,l≤5×106,1≤k≤100,1≤T≤101\leq n,m,l\leq 5\times 10^6,1\leq k\leq 100,1\leq T\leq 101n,m,l5×106,1k100,1T10


解题思路

恰好我们很难进行计数,所以我们考虑钦定kkk个极大值,然后用二项式反演。

假设n≤m≤ln\leq m\leq lnml,那么极大值个数不超过nnn个。

考虑怎么求钦定kkk个极大值时的方案,首先每个极大值的位置是没有关系的,因为三个坐标都肯定各不相同。

那么我们就默认第iii个最大值的位置是(i,i,i)(i,i,i)(i,i,i),且第iii个极大值ai<ai+1a_i<a_{i+1}ai<ai+1

这样的话对于每个极大值限制的范围就是一层一层的嵌套。先考虑不在限制范围内的数,选一些填上,那么方案就是(nml(n−k)(m−k)(l−k))\binom{nml}{(n-k)(m-k)(l-k)}((nk)(mk)(lk)nml),然后还要考虑在外面填的方案那么总方案就是Anml(n−k)(m−k)(l−k)A_{nml}^{(n-k)(m-k)(l-k)}Anml(nk)(mk)(lk)

然后考虑填被限制的数字的方案,从外层开始填,那么第一层就是除了(1,1,1)(1,1,1)(1,1,1)以外随便填了。

为了方便我们记Gk=(n−k)(m−k)(l−k)G_k=(n-k)(m-k)(l-k)Gk=(nk)(mk)(lk)那么第一层的方案就是(G0−G1−1)!(G_0-G_{1}-1)!(G0G11)!,同样推出第二层的方案(G1−G2−1)!(G_1-G_2-1)!(G1G21)!,不过要把第二层的数字穿插在第一层中(除了极大值),那么就是(G1−G2−1)!×CG0−G2−1G1−G2−1(G_1-G_2-1)!\times C_{G_0-G_2-1}^{G_1-G_2-1}(G1G21)!×CG0G21G1G21

那么写出总答案就是
1G0!AG0Gk∏i=0k−1(Gi−Gi+1−1)!CG0−Gi+1−1Gi−Gi+1−1\frac{1}{G_0!}A_{G_0}^{G_k}\prod_{i=0}^{k-1}(G_i-G_{i+1}-1)!C_{G_0-G_{i+1}-1}^{G_i-G_{i+1}-1}G0!1AG0Gki=0k1(GiGi+11)!CG0Gi+11GiGi+11
拆分开来
1Gk!∏i=0k−1(Gi−Gi+1−1)!(G0−Gi+1−1)!(Gi−Gi+1−1)!(G0−Gi)!\frac{1}{G_k!}\prod_{i=0}^{k-1}(G_i-G_{i+1}-1)!\frac{(G_0-G_{i+1}-1)!}{(G_i-G_{i+1}-1)!(G_0-G_i)!}Gk!1i=0k1(GiGi+11)!(GiGi+11)!(G0Gi)!(G0Gi+11)!
1Gk!∏i=0k−1(G0−Gi+1−1)!(G0−Gi)!\frac{1}{G_k!}\prod_{i=0}^{k-1}\frac{(G_0-G_{i+1}-1)!}{(G_0-G_i)!}Gk!1i=0k1(G0Gi)!(G0Gi+11)!
我们会发现我们能用前面的1Gk!\frac{1}{G_k!}Gk!1的某些部分去补足后面G0−GiG_0-G_{i}G0GiG0−Gi+1−1G_0-G_{i+1}-1G0Gi+11的差,但是因为会有重复部分,我们只提出[G0−Gi+1,G0−Gi+1][G_0-G_i+1,G_0-G_{i+1}][G0Gi+1,G0Gi+1]这一部分就有
∏i=1k1G0−Gi∏i=0k−1Gi\prod_{i=1}^{k}\frac{1}{G_0-G_i}\prod_{i=0}^{k-1}G_ii=1kG0Gi1i=0k1Gi

这样我们用O(n)O(n)O(n)预处理逆元的方法就可以做到O(Tn)O(Tn)O(Tn)了。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e6+10,P=998244353;
ll T,n,m,l,k,fac[N],fnv[N];
ll g[N],G[N],f[N],inv[N],ans;
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
ll C(ll n,ll m)
{return fac[n]*fnv[m]%P*fnv[n-m]%P;}
signed main()
{fnv[0]=fnv[1]=fac[0]=1;for(ll i=2;i<N;i++)fnv[i]=P-fnv[P%i]*(P/i)%P;for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%P,fnv[i]=fnv[i-1]*fnv[i]%P;scanf("%lld",&T);while(T--){scanf("%lld%lld%lld%lld",&n,&m,&l,&k);ll S=n*m%P*l%P;g[0]=S;ans=0;if(m<n)swap(n,m);if(l<n)swap(n,l);inv[0]=1;if(k>n){puts("0");continue;}for(ll i=1;i<=n;i++){G[i]=(S-(n-i)*(m-i)%P*(l-i)%P+P)%P;g[i]=(n-i)*(m-i)%P*(l-i)%P;inv[i]=inv[i-1]*G[i]%P;}inv[n]=power(inv[n],P-2);for(ll i=n;i>=1;i--)inv[i-1]=inv[i]*G[i]%P;f[0]=1;for(ll i=1;i<=n;i++)f[i]=f[i-1]*g[i-1]%P;for(ll i=0;i<=n;i++)f[i]=f[i]*inv[i]%P;for(ll i=k;i<=n;i++)(ans+=C(i,k)*f[i]%P*(((i-k)&1)?(P-1):1)%P)%=P;printf("%lld\n",ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「CEOI2019」魔法树(DP+差分启发式合并)

「CEOI2019」魔法树 description solution 设dpi,j:idp_{i,j}:idpi,j​:i子树在jjj时刻的最大果汁量&#xff0c;显然dpi,jdp_{i,j}dpi,j​在jjj是单调递增的 dpi,jmax⁡(dpi,j,dpi,j−1)dp_{i,j}\max(dp_{i,j},dp_{i,j-1})dpi,j​max(dpi,j​,dpi,j−1​) iii不收获 dpi,j∑…

梁迪:我为MVP骄傲,《微软最有价值专家奖励计划介绍》附专题视频

题记&#xff1a;有些事情&#xff0c;比 MVP 更加不朽&#xff0c;浩气长空&#xff0c;日月星汉&#xff0c;我们为 MVP 和那些心目中的“MVP”感到骄傲。微软 MVP 是一种追求&#xff0c;不必要去强求&#xff0c;但 MVP 必定是俱乐部发展的根基础。火车跑得快全凭车头带&am…

CF1472(div3):总结

文章目录前言A. Cards for Friends题意简述解析代码B. Fair Division题意简述解析代码C. Long Jumps题意简述解析代码D. Even-Odd Game题意简述解析代码E. Correct Placement题意简述解析代码F. New Years Puzzle题意简述解析代码G. Moving to the Capital题意简述解析代码前言…

How Much Memory Your Code Is Using? Gym - 101955J

How Much Memory Your Code Is Using? Gym - 101955J 题意&#xff1a; t组数据&#xff0c;每组数据会有n个定义类型的方式&#xff0c;给你每个类型所占字节&#xff0c;问一共占了多少字节&#xff0c;最终答案按照Kibibyte单位输出&#xff0c;并向上取整 题解&#xf…

P3295 [SCOI2016]萌萌哒(DP+倍增)

P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同&#xff0c;很容易就想到了并查集&#xff0c;直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结构将其转化成O(nlog⁡n)O(n\log n)O(nlogn)的 树之类的就不考虑了&#xff0c;一段一段的区间…

CF1677D-Tokitsukaze and Permutations【结论】

正题 题目链接:https://www.luogu.com.cn/problem/CF1677D 题目大意 对于一个排列pip_ipi​&#xff0c;定义一个序列vF(p)vF(p)vF(p)&#xff0c;其中vi∑j1i−1[pj>pi]v_i\sum_{j1}^{i-1}[p_j>p_i]vi​∑j1i−1​[pj​>pi​]。 一次冒泡排序为依次对1∼n−11\sim…

【恭贺新春】2019年春节放假

2019年放假通知致全体微友&#xff1a; 2019年2月5日&#xff08;正月初一&#xff09;至2月8日&#xff08;正月初四&#xff09;春节放假&#xff0c;共4天&#xff0c;小编停止更新公众号信息。敬请相互转告。值此新春佳节到来之际&#xff0c;“dotNet跨平台”给大家拜个…

模板:圆方树

所谓圆方树&#xff0c;就是又圆又方的树 &#xff08;逃&#xff09; 前言 树有很多良好的性质&#xff0c;也可以上许多算法和数据结构 但我们对于一般图却没有太多办法… 然而&#xff0c;对于有些关注连同性、路径并&交的一般图问题&#xff0c;我们可以用圆方树&…

C - Insertion Sort Gym - 101955C

C - Insertion Sort Gym - 101955C 题意&#xff1a; t组数据&#xff0c;每组数据给你n&#xff0c;k&#xff0c;q&#xff0c;让你求存在多少合法的1~n排列 合法要求&#xff1a; 对排列的前k项进行排序&#xff0c;使得整个序列中最长的递增子序列长度为n-1 题解&#x…

P8330-[ZJOI2022]众数【根号分治】

正题 题目链接:https://www.luogu.com.cn/problem/P8330 题目大意 给出一个长度为nnn的序列aaa&#xff0c;你可以选择其中一个区间将其加上任意整数&#xff0c;要求这个序列的众数出现次数最多。 输出最多次数和可能的众数。 1≤n≤2105,1≤ai≤109,∑n≤51051\leq n\leq …

华为云.NET Core支持情况调查

各大公有云都提供了开发者开发的SDK&#xff0c;今天我们来看看华为云对.NET Core的支持情况怎么样&#xff1f; .NET SDK地址 https://developer.huaweicloud.com/sdk#.NET华为云的.NET SDK相比其他语言少的可伶&#xff0c;而且这几个SDK还不支持.NET Core。SDK的支持实在太差…

[2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

[2021-07-19 内测] NOIP操作descriptionsolutioncode异或descriptionsolutioncode等级descriptionsolutioncode矩阵descriptionsolutioncode操作 description 有n堆石子&#xff0c;每堆石子都有一定的数量&#xff0c;第i堆石子的数量用Ai表示。 任意两堆石子均可合并&…

codeforces:1361(div1)1362(div2):总结

文章目录前言1362-A. Johnny and Ancient Computer解析1362-B - Johnny and His Hobbies解析1362-C - Johnny and Another Rating Drop解析1361-A Johnny and Contribution解析1361-B - Johnny and Grandmaster解析1361-C - Johnny and Megans Necklace解析1361-D - Johnny and…

2018沈阳区域赛

题目地址 题号题目知识点难度ASockpuppetsBSequences GeneratorCInsertion Sort找规律&#xff0c;推公式DDiameter of a TreeEThe Kouga Ninja ScrollsFCounting Sheep in Ami DongsuoGBest ACMer Solves the Hardest Problem思维暴力HRainbow GraphIDistance Between Sweeth…

.NET和Java之争

这几天连续有多篇文章诋毁.NET&#xff0c;这类文章我十几年前就看得多了&#xff0c;只不过十几年前是C和C之争&#xff0c;C和Java之争。我从来不理这类文章&#xff0c;因为这类口水战并没有什么实际意义。然而接连收到多位粉丝私聊说&#xff0c;主席&#xff0c;你应该写点…

P8329-[ZJOI2022]树【容斥,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P8329 题目大意 有两棵nnn个点的有根树。 第一棵根为111&#xff0c;第iii个点的父亲在[1,i−1][1,i-1][1,i−1]中。第二棵根为nnn&#xff0c;第iii个点的父亲在[i1,n][i1,n][i1,n]中。每个点都恰好在一棵树中作为叶子。 …

线性代数一之矩阵转向量随机化求解——神奇的矩阵(BZOJ)+向量内积

向量随机化神奇的矩阵descriptionsolutioncode[NOI2013]向量内积descriptionsolutioncode矩阵既可以看成是一张数位表&#xff0c;也可以看成是若干个行向量或者若干个列向量的向量表神奇的矩阵 description solution 暴力做A∗BA*BA∗B会达到n3n^3n3的复杂度&#xff0c;难…

G - Best ACMer Solves the Hardest Problem Gym - 101955G

G - Best ACMer Solves the Hardest Problem Gym - 101955G 题意&#xff1a; 我们需要建立一个数据库以支持实时查询和修改。这个数据库中的记录是点坐标 (x,y) 和其权值 w。查询与修改操作可以表示为 1 x y w&#xff0c;在 (x,y) 处插入一个新的点&#xff0c;我们保证在…

模板:Link Cut Tree(LCT)

文章目录前言解析原理rotate(x)splay(x)access(x)findroot(x)makeroot(x)split(x,y)link(x,y)cut(x,y)pushdown(x)完整代码所谓Link Cut Tree&#xff0c;就是林可卡特发明的tree &#xff08;逃&#xff09; 前言 终于走到了这一天… 其实感觉没有预想的那么难&#xff08;单…

P6803-[CEOI2020]星际迷航【博弈论,dp,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P6803 题目大意 给出一棵nnn个点的树&#xff0c;把它复制出D1D1D1层&#xff0c;编号为[0,D][0,D][0,D]&#xff0c;然后每一层随机一个点向下一层随机一个点连边。 然后从第000层的111号点出发&#xff0c;两个人轮流操作…