【P3158】放棋子 - Harvey

news/2025/9/17 21:15:14/文章来源:https://www.cnblogs.com/zhuhy0826/p/19097554

题意

\(c\) 种棋子,每种棋子都有相应的个数,要把全部棋子放入棋盘中,使得每一行和每一列没有颜色相同的棋子,求方案数。

思路

从行和列的角度显然不好处理,所以我们可以先从颜色的种类入手。
设计 \(f_{c,i,j}\) 表示前 \(c\) 种颜色,已经有 \(i\) 行,\(j\) 列被占领的方案数。
枚举放第 \(c\) 种棋子要占据 \(x\) 行,\(y\) 列,则有转移:

\[f_{c,i,j} = f_{c-1,i-x,j-y}*g_{x,y,a_c} \]

\(g_{x,y,a_c}\) 表示将 \(a_c\) 个数填入 \(x*y\) 的表格中使得每一行每一列都有数的方案数。
考虑如何转移(难点),同样采用总 - 非法的策略:

  • 总:是显然的,即 \(\binom{i*j}{k}\)
  • 非法:即有行或列是空出来的,枚举空出来多少行列,则有 \(g_{i,j,k} = \binom{i}{x} \binom{j}{y} g_{x,y,k}\)

上下相减就是答案。
但是要注意非法的时间复杂度是 \(O(n^6)\),考虑把 \(k\) 提前,换成 \(a_c\),算完 \(g\) 就直接算 \(f\),这样时间复杂度就是 \(O(n^5) 了\)

code

#include<bits/stdc++.h>
#define ll long longusing namespace std;const ll N = 31,M = 11,mod = 1e9+9;int n,m,p,cnt;
int a[M];
ll f[M][N][N];
ll dp[N][N];
ll C[N*N][N*N],fac[N*N];void init() {C[0][0]=1,fac[0]=1;for(int i=1;i<=900;i++){C[i][0]=1,fac[i]=fac[i-1]*i%mod;for(int j=1;j<=i;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}
}void add(ll &x,ll y){(x+=y)%=mod,(x+=mod)%=mod;
}
int main() {cin>>n>>m>>p;init();for(int i=1;i<=p;i++){ll x;cin>>x;if(x)a[++cnt]=x;}p=cnt;f[0][0][0]=1;for(int k=1;k<=p;k++){memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(i*j<a[k] || i>a[k] || j>a[k])continue;dp[i][j]=C[i*j][a[k]];for(int x=1;x<=i;x++)for(int y=1;y<=j;y++)if(x<i || y<j)add(dp[i][j],-dp[x][y]*C[i][x]%mod*C[j][y]%mod);
//				cout<<k<<" "<<i<<" "<<j<<" "<<dp[i][j]<<"\n";}//1 2 2for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int x=1;x<=min(i,a[k]);x++){for(int y=1;y<=j;y++){if(x*y<a[k])continue;add(f[k][i][j],f[k-1][i-x][j-y]*C[n-i+x][x]%mod*C[m-j+y][y]%mod*dp[x][y]%mod);}}//				cout<<c<<" "<<i<<" "<<j<<" "<<f[c][i][j]<<"\n";}}}ll ans=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)ans+=f[p][i][j],ans%=mod;cout<<ans;return 0;
}

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

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

相关文章

最强AI语音克隆和文本配音工具!与真人无异,CosyVoice下载介绍

CosyVoice是一个大规模预训练语言模型,深度融合文本理解和语音生成的一项新型语音合成技术,能够精准解析并诠释各类文本内容,将其转化为宛如真人般的自然语音 CosyVoice采用了总共超15万小时的数据训练,依托先进的…

详细介绍:如何在公众号接入海外招聘数据分析智能体

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Linux 系统插入U盘/移动硬盘实现自动挂载

在 /etc/udev/rules.d/ 目录下建立挂载规则 文件名后缀为 xxx.rulesKERNEL=="sd[a-z][1]", ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", RUN{program}+="/u…

来点人瑞平我

不知道自己定位了,来帮助我找找(

在Unity2021中使用Profiler的Deep Profile功能时内存超高怎么办? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

日总结 2

老师同样为学期初开了个头,没有讲什么重要是知识。我这天完成了Linux的安装和配置,完成了安装hadoop需要的环境配置和jdk的配置,为hbase的使用安装做铺垫。

LeetCode 24. 两两交换链表中的节点 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【P2051】中国象棋 - Harvey

题意 求有多少种棋盘使得每一列和每一行的棋子个数不超过 \(2\) 个。 思路 设计 \(f_{i,j,k}\) 表示前 \(i\) 行,有 \(j\) 列为 \(1\) 个棋子,\(k\) 列为 \(0\) 个棋子。考虑当前行放 \(0\) 个棋子,则有 \(f_{i,j,k…

mysql 8.0查看正在执行的事务锁

SELECT * FROM performance_schema.data_lock_waits; -- MySQL 8.0+ SELECT r.trx_id AS waiting_trx_id, r.trx_mysql_thread_id AS waiting_thread, r.trx_query AS waiting_query, b.trx_id AS blocking_trx_id, b.…

JavaDay6

可变参数JDK1.5开始,Java支持传递同类型的可变参数给一个方法 在方法声明中,在指定参数类型后加一个省略号(...)。 一个方法只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。pa…

基于SpringBoot+Vue的大学生心理互助社区系统设计与建立

基于SpringBoot+Vue的大学生心理互助社区系统设计与建立2025-09-17 20:59 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

Ubuntu Linux 云服务器常见安全漏洞修复方法汇总 Apache/OpenSSH/DNS

安全漏洞名称/CVE修复方案1. Apache HTTP Server 缓冲区错误漏洞(CVE-2023-31122)2. Apache HTTP Server 资源管理错误漏洞(CVE-2023-43622)3. Apache httpd 资源管理错误漏洞(CVE-2024-27316)4. Apache HTTP Se…

JavaScript学习笔记(1)

JavaScript学习笔记(1)引用外部文件中的js文件:<script src="Path"></script> 和html文件相同,路径从index.html所在的根目录起。 输出window.alert() 弹出警告框,警告框的样式由浏览器决定…

多个 root 用户记录,而且有些记录的密码是空的,导致认证混乱。

多个 root 用户记录,而且有些记录的密码是空的,导致认证混乱。 留言:之前再讲mysql时候,经常有人可以远程登录的时候,结果发现没办法本地登录了,具体体现方式是这样的(看问题体现):现在我可以明确的告诉你们,是…

Min-Max 容斥小记

Min-Max 容斥小记 Min-Max 容斥 对于集合 \(S\),定义 \(\max(S)=\max_{x\in S} x\),同理可以定义 \(\min(S)\)。Min-Max 容斥给出了以下结论: \[\max(S)=\sum _{T\subseteq S} (-1)^{|T|-1}\min(T) \]对 \(\min\) 也…

【POJ1737】Connected Graph - Harvey

题意 求有标号联通无向图的个数。 思路 不妨设 \(f_{n}\) 表示有 \(n\) 个点时有标号联通无向图的个数。 考虑用总情况减去不连通情况。 总情况 总情况显然是 \(2^{\binom{n}{2}}\)(每两个点的边选或不选)。 不连通 …

详细介绍:VirtualBox 免费轻量的全能虚拟机,跨平台系统随心装

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …