NTT

news/2025/9/27 23:33:34/文章来源: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/920091.shtml

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

相关文章

绘制倒杨辉三角形

目标输出:分析: 这个问题与普通输出杨辉三角形差别不大,但我没输出过正杨辉三角形。这里的核心思想在于对数组的处理。 实现代码: 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.提升代码效率

课程中的所有动手动脑的问题以及课后实验性的问题

课程中的所有动手动脑的问题以及课后实验性的问题审核稿件方法reviewManuscript ( ) (1)显示审核稿件子界面reviewFrame();(2)判断该稿件编号是否存在judgeManuscript ( ) 。(3)如果库中不存在该稿件信息,则…

网站开发技术报告模板网络营销有哪些模式

简介&#xff1a;如何帮助金融客户“用好云”&#xff1f;做「政企数智创新的同行者」&#xff0c;这对于阿里云混合云来说不仅仅是一句口号&#xff0c;更是在千行百业践行的行动指南。 “我一秒钟几千万上下&#xff0c;会跟你们吃杂碎面&#xff1f;” 这句出自星爷电影台…

网站设计网页的优缺点页面设计翻译

引言 在BERT的预训练阶段,需要对数据集进行特定的处理,以生成适用于 Masked Language Modeling(MLM)和 Next Sentence Prediction(NSP)任务的数据。以下是详细的步骤和方法: 1. 原始文本数据的准备 首先,需要收集大量的无标签纯文本数据,例如: 1.维基百科:涵盖广泛主…

大一网站开发项目答辩WordPress主题文本

1. 前言 如图1所示&#xff0c;R14是连接寄存器&#xff08;Link Register&#xff09;&#xff0c;在汇编指令中通常也写为LR&#xff0c;用于存储函数调用和异常等的返回信息&#xff0c;复位时&#xff0c;默认值为0xFFFFFFFF&#xff1b; 图1 Core register R15是程序计数…

专业做食材网站浏阳做网站

启动Python有两种方式&#xff0c;分别为“Windows命令行窗口”和“IDLE” “命令行窗口”下可以通过如下两种方法&#xff1a; 1. import subprocess subprocess.call("clear") # linux/mac subprocess.call("cls", shellTrue) # windows 执行完次命令后&…

New_Sort_Integer_Sequential解析

New_Sort_Integer_Sequential解析import java.util.ArrayList; public class New_Sort_Integer_Sequential { static void sort(ArrayList<Integer> list, Integer left, Integer right) { if (right <= left…