当前位置: 首页 > news >正文

【P3158】放棋子 - Harvey

题意

\(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.wxhsa.cn/company.asp?id=6960

相关文章:

  • 最强AI语音克隆和文本配音工具!与真人无异,CosyVoice下载介绍
  • 近日C++线上练习结果
  • 密力根油滴实验实验报告
  • Linux 系统插入U盘/移动硬盘实现自动挂载
  • 来点人瑞平我
  • 【P2051】中国象棋 - Harvey
  • JavaDay6
  • Ubuntu Linux 云服务器常见安全漏洞修复方法汇总 Apache/OpenSSH/DNS
  • AI智能体开发实战:从提示工程转向上下文工程的完整指南
  • 解码C语言九条语句
  • 多个 root 用户记录,而且有些记录的密码是空的,导致认证混乱。
  • 解题报告-P11670 [USACO25JAN] Cow Checkups S
  • word vba 对 带编号格式的PO单 段落下添加对应的图片
  • 解题报告-P11671 [USACO25JAN] Farmer Johns Favorite Operation S
  • 解码C语言运算符
  • 多进程
  • 93. 递归实现组合型枚举
  • Sort方法学习(伪代码记录)
  • 深入解析:【每日一问】运算放大器与比较器有什么区别?
  • 9.17支配对问题专题总结
  • 记录知识
  • AT_agc058_b [AGC058B] Adjacent Chmax
  • Jenkins CVE-2018-1000600漏洞利用与SSRF攻击分析
  • NOIP 集训日记(学术)
  • linux中mysql如何远程连接
  • 详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
  • 深入解析:PYcharm——pyqt音乐播放器
  • Day02
  • 专题:Python实现贝叶斯线性回归与MCMC采样数据可视化分析2实例|附代码数据
  • 威联通NAS如何导入本地docker镜像