Combinatorics

news/2025/9/27 23:38:41/文章来源:https://www.cnblogs.com/juruo-zzt/p/19115905

[ICPC 2024 Nanjing R] Bingo

先给序列排序,权值相同的钦定标号前的更小。转化成 \(Ans\le a_k\) 的情况,等价于 \(k\)\(1\)\(nm-k\)\(0\) 放入 \(n\times m\) 的矩阵,至少有一行或者一列是全 \(1\)。考虑其反面,钦定共 \(i\)\(j\) 列都是 \(1\) 然后容斥,那么有:

\[f(k)=k!(nm-k)!\sum_{i=0}^n\sum_{j=0}^m(-1)^{i+j}\binom ni\binom mj\binom{nm-nj-im+ij}{k-nj-im+ij} \]

\(s=nj+im-ij\),则 \(\binom{nm-nj-im+ij}{k-nj-im+ij}=\binom{nm-s}{k-s}=(nm-s)!/\left((k-s)!(nm-k)!\right)\)

\(g(s)=\sum_{i=0}^n\sum_{j=0}^m(-1)^{i+j}\binom ni\binom mj(nm-s)!\)\(h(s)=1/s!\),那么 \(f(k)=k!\sum_s g(s)h(k-s)\),卷积即可求出所有的 \(f(k)\),答案即:

\[\sum_{i=1}^{nm}(f(i)-f(i-1))a_i \]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define mp make_pair
#define pb push_back
#define fi first
#define se second
inline 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;
}
const int N=8e5+10,mod=998244353,G=3,I=332748118,maxn=2e5;
void Add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
void Sub(int &x,int y){x-=y;if(x<0)x+=mod;}
int qpow(int a,int n)
{int ans=1;while(n){if(n&1)ans=1ll*a*ans%mod;a=1ll*a*a%mod;n>>=1; }return ans;
}
namespace poly
{int r[N];void ntt(vector<int> &a,int lim,int k){for(int i=0;i<lim;i++)if(i<r[i])swap(a[i],a[r[i]]);for(int mid=1;mid<lim;mid<<=1){int wn=qpow(k?G:I,(mod-1)/(mid<<1));for(int R=mid<<1,j=0;j<lim;j+=R){int w=1;for(int t=0;t<mid;t++,w=1ll*w*wn%mod){int x=a[j+t],y=1ll*w*a[j+mid+t]%mod;a[j+t]=(x+y)%mod,a[j+mid+t]=(x-y+mod)%mod;}}}}vector<int> mul(vector<int> f,vector<int> g){int n=f.size()-1,m=g.size()-1,lim=1,l=0;while(lim<=n+m)lim<<=1,l++;for(int i=0;i<lim;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));f.resize(lim),g.resize(lim);ntt(f,lim,1),ntt(g,lim,1);vector<int> h(lim);for(int i=0;i<lim;i++)h[i]=1ll*f[i]*g[i]%mod;ntt(h,lim,0);int inv=qpow(lim,mod-2);for(int i=0;i<=lim;i++)h[i]=1ll*h[i]*inv%mod;while(!h.empty()){if(!*--h.end())h.pop_back();else break;}return h;}
}
using poly::mul;
int a[N],g[N],fac[N],ifac[N];
int binom(int n,int m){return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;}
void sol()
{int n=read(),m=read();for(int i=1;i<=n*m;i++)a[i]=read();sort(a+1,a+n*m+1);vector<int> f(n*m+1),g(n*m+1);for(int i=0;i<=n;i++)for(int j=0;j<=m;j++){int s=n*j+i*m-i*j;if((i+j)&1)Sub(g[s],1ll*binom(n,i)*binom(m,j)%mod*fac[n*m-s]%mod);else Add(g[s],1ll*binom(n,i)*binom(m,j)%mod*fac[n*m-s]%mod);}for(int i=0;i<=n*m;i++)f[i]=ifac[i];f=mul(f,g);for(int i=0;i<=n*m;i++)f[i]=1ll*f[i]*ifac[n*m-i]%mod*fac[i]%mod*fac[n*m-i]%mod;for(int i=0;i<=n*m;i++)f[i]=(fac[n*m]-f[i]+mod)%mod;for(int i=n*m;i>=1;i--)Sub(f[i],f[i-1]); int Ans=0;for(int i=1;i<=n*m;i++)Add(Ans,1ll*f[i]*a[i]%mod);printf("%d\n",Ans);
}
int main()
{fac[0]=1;for(int i=1;i<=maxn;i++)fac[i]=1ll*fac[i-1]*i%mod;ifac[maxn]=qpow(fac[maxn],mod-2);for(int i=maxn-1;i>=0;i--)ifac[i]=1ll*(i+1)*ifac[i+1]%mod; int T=read();while(T--)sol();return 0;
}

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

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

相关文章

idea必备插件

1:gitToolBox————查看每行代码提交人 2:Translation————翻译插件 3:CheckStyle-IDEA————代码规范 4:Rainbow Brackets————彩虹括号 5:Nyan Progress Bar————可爱进度条 6:HighlightBracketP…

怎么做网站的点击率深圳公司网站设计

使用c语言如何统计单词个数发布时间&#xff1a;2020-04-21 13:58:58来源&#xff1a;亿速云阅读&#xff1a;207作者&#xff1a;小新使用c语言如何统计单词个数&#xff1f;相信有很多人都不太了解&#xff0c;今天小编为了让大家更加了解Golang&#xff0c;所以给大家总结了…

上海做营销网站哪个公司好想网上卖家具怎么做网站

Android XML 约束布局 参考 TextView居中 TextView 垂直居中并且靠右 TextView 宽高设置百分比 宽和高的比例 app:layout_constraintDimensionRatio"h,2:1" 表示子视图的宽高比为2:1&#xff0c;其中 h表示保持宽度不变&#xff0c;高度自动调整。 最大宽度 设…

怎么做网站的后台维护淘宝官网免费开店入口

大数据系列之&#xff1a;腾讯云服务器性能和价格比较 一、磁盘性能和价格比较二、高性能云硬盘三、ssd云硬盘四、极速型ssd云硬盘五、增强型ssd云硬盘六、查看腾讯云服务器价格 一、磁盘性能和价格比较 磁盘名称高性能ssd云硬盘极速型ssd云硬盘增强型ssd云硬盘规格500g 5800 …

NTT

[ICPC 2024 Nanjing R] Bingo 先给序列排序,权值相同的钦定标号前的更小。转化成 \(Ans\le a_k\) 的情况,等价于 \(k\) 个 \(1\),\(nm-k\) 个 \(0\) 放入 \(n\times m\) 的矩阵,至少有一行或者一列是全 \(1\)。考虑…

绘制倒杨辉三角形

目标输出:分析: 这个问题与普通输出杨辉三角形差别不大,但我没输出过正杨辉三角形。这里的核心思想在于对数组的处理。 实现代码: include<stdio.h> int main() { int row; scanf_s("%d", &ro…

织梦cms sql注入破解网站后台管理员账号密码艺术学校网站模板

该系统利用python语言、MySQL数据库&#xff0c;flask框架&#xff0c;结合目前流行的 B/S架构&#xff0c;将stone音乐播放器的各个方面都集中到数据库中&#xff0c;以便于用户的需要。该系统在确保系统稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该系统由管理…

ABC425 总结

E 模数不是质数。EXCRT? 考虑排好了前 \(i-1\) 个颜色,插入第 \(i\) 个颜色的方案数。定义 \(sum=\sum_{k=1}^{i-1}{C_k}\),由插板法得答案为 \(\dbinom{sum}{C_i}\)。把每种颜色的答案相乘即可。代码。 F 状压 DP,…

解决方案 | 无需安装任何插件,chrome如何快速搜索书签

这里的三个方法挺好:https://www.cnblogs.com/miracle-luna/p/16211893.html 但是需要切换页面,我认为有点麻烦。要想不切换页面,那么可以按照下面3步即可实现快速搜索。一、点击chrome右上角的“所有书签” 二、打…

订单模块逐字稿

订单表设计 订单表通常采用的结构是订单主表与订单明细表一对多关系结构,比如:在电商系统中,一个订单购买的多件不同的商品,设计订单表和订单明细表: 订单表:记录订单号、订单金额、下单人信息、订单状态等信息。…

课后作业小结

Java学习动手问题整理 最近跟着老师学Java基础,遇到了不少需要动手验证的小问题,整理了几个印象深的,记录下我的思考和结果,方便以后复习。 一、枚举类型怎么用? 老师让看EnumTest.java,我自己写了个简单例子试了…

自己怎么给网站做优化广元市网站建设

Open Images Dataset https://www.youtube.com/watch?vdLSFX6Jq-F0

课后3

import java.util.Random; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String yanzhengma = generateyanzhengma(); Syste…

尝试决定

焦虑迷茫这么久,还是打算转前端 同时尝试投简历!

竞赛第一步----进实验室

今天我成功进入了学校的计算机应用实验室,向我的竞赛梦想前进了一步,说实话今天的机试让我充分地意识到自己的不足,做的代码题目还是太少了,今后还需继续努力,加油!!!

Java语法基础课程动手动脑与实验问题深度解析

在Java语法基础的学习旅程中,动手实践与问题探究从来都不是可有可无的环节,而是将枯燥的理论知识转化为实用应用能力的关键桥梁。课程里那些围绕枚举类型、变量作用域、数据类型转换、字符串拼接和位运算展开的动手动…

杭州制作企业公司网站可信赖的网站建设公司

01 早年独孤混群。 刚开始只会发自己的副业项目资料。 资料里面全是钩子。 所以被群主踢了。 刚开始很生气&#xff0c;后来发现自己的社群也有人打广告。 才慢慢理解那种感受。 随后混的群&#xff0c;都是以价值分享和副业心得为主。 给社群的其他小伙伴&#xff0c;…

lc1038-从二叉搜索树到更大和树

难度:中等(初期)题目描述给定一棵BST,给每个节点都加上大于自身数值的节点的值示例 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]…

课程中的问题

课程中的问题1.设计程序实现不同数据类型的强制转换避免精度丢失 2.生成验证码如何生成随机数 3.如何将一个完整的程序拆分成不同的部分进行高效的实现 4.提升代码效率