题解

本题是一个 \(DP\) 加 容斥,容斥的式子很好推,重点是如何想到和如何推出 \(DP\) 部分的式子。

因为不同种颜色的棋子不能放在同一行或同一列,所以不同种的棋子是相对独立的。

据此,我们可以推出一个式子,设 \(f_{i,j,k}\) 表示前 \(k\) 种颜色占据了 \(i\) 行 \(j\) 列。

\[f_{i,j,k}=\sum_{l=0}^{i-1}\sum_{r=0}^{j-1}f_{l,r,k-1}×g_{i-l,j-r,num_k}×(^{n-l}_{i-l})×(^{m-r}_{j-r})
\]

其中 \(g_{i,j,k}\) 表示 \(k\) 个棋子占据 \(i\) 行 \(j\) 列,\(num_k\) 表示第 \(k\) 种颜色棋子的个数,后面的表示组合数。

来解释一下这个式子,其中因为 \(k-1\) 已经占据了 \(l\) 行 \(r\) 列,那么第 \(k\) 种颜色的棋子要占据 \(i-l\) 行 \(j-r\) 列。

所以这 \(num_k\) 颗棋子只能放在这 \(i-l\) 行 \(j-r\) 行的交汇处,所以由此我们可以得出 \(g\) 的式子

显然直接推不好推,所以我们要用容斥。易得 \(g_{i,j,k}\) 初始状态设为 \((^{i×j}_{num_k})\) ,但其中有一些情况无法占据所有的行列,所以

\[g_{i,j,k}=g_{i,j,k}-\sum_{l=1}^{i}\sum_{r=1}^{j} g_{l,r,k}×(^{i}_{l})×(^{j}_{r})[(l\le i)||(r\le j)]
\]

最后,所有的行列不一定占据,但所有种类的棋子一定要放上,所以答案即为

\[\sum_{i=1}^{n}\sum_{j=1}^{m}f_{i,j,c}
\]

\(AC \kern 0.4emCODE:\)

#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
inline char gc() {return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
inline int read() {
ri x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
#define ll long long
static const int N=33;
static const int MOD=1e9+9;
static const int CN=12;
int C[N*N][N*N],g[N][N],f[N][N][CN],n,m,c;
inline int main() {
n=read(),m=read(),c=read();
const int S=n*m;
C[0][0]=f[0][0][0]=1;
for (ri i(1);i<=S;p(i)) {
C[i][0]=1;
for (ri j(1);j<=i;p(j)) C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
for (ri k(1);k<=c;p(k)) {
ri num=read();
memset(g,0,sizeof(g));
for (ri i(1);i<=n;p(i)) {
for (ri j(1);j<=m;p(j)) {
if (i*j<num) continue;//要加上优化,显然
g[i][j]=C[i*j][num];
for (ri l(1);l<=i;p(l)) {
for (ri r(1);r<=j;p(r)) {
if (l==i&&r==j) continue;
g[i][j]=((ll)g[i][j]-(ll)g[l][r]*C[i][l]%MOD*C[j][r]%MOD+MOD)%MOD;
// printf("g[%d][%d]=%d\n",i,j,g[i][j]);
}
}
}
}
for (ri i(1);i<=n;p(i)) {
for (ri j(1);j<=m;p(j)) {
for (ri l(0);l<i;p(l)) {
for (ri r(0);r<j;p(r)) {
if ((i-l)*(j-r)<num) break;
f[i][j][k]=((ll)f[i][j][k]+(ll)f[l][r][k-1]*g[i-l][j-r]%MOD*C[n-l][i-l]%MOD*C[m-r][j-r]%MOD)%MOD;
}
}
}
}
}
int ans=0;
for (ri i(1);i<=n;p(i)) {
for (ri j(1);j<=m;p(j)) ans=(ans+f[i][j][c])%MOD;
}
printf("%d\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}

时间复杂度 \(O(n^2m^2c)\)

题解 P3158 [CQOI2011]放棋子的更多相关文章

  1. P3158 [CQOI2011]放棋子(dp+组合数)

    P3158 [CQOI2011]放棋子 放棋子的顺序和方案数无关,所以可以从按颜色递推 设$f[u][p][k]$为放到第$u$种颜色,所剩空间$p*k$的方案数 $g[u][i][j]$表示第$u$ ...

  2. [洛谷P3158] [CQOI2011]放棋子

    洛谷题目链接:[CQOI2011]放棋子 题目描述 在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同 颜色的棋子不能在同一行或者同一列.有多少祌方法?例如,n=m=3,有两个 ...

  3. 洛谷P3158 [CQOI2011]放棋子 组合数学+DP

    题意:在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少祌方法? 解法:这道题不会做,太菜了qwq.题解是看洛谷大佬的. 设C是组合数, ...

  4. P3158 [CQOI2011]放棋子

    传送门 题解(因为公式太多懒得自己抄写一遍了--) //minamoto #include<bits/stdc++.h> #define ll long long #define R re ...

  5. BZOJ 3294: [Cqoi2011]放棋子

    3294: [Cqoi2011]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 628  Solved: 238[Submit][Status] ...

  6. bzoj3294[Cqoi2011]放棋子 dp+组合+容斥

    3294: [Cqoi2011]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 755  Solved: 294[Submit][Status] ...

  7. [CQOI2011]放棋子 (DP,数论)

    [CQOI2011]放棋子 \(solution:\) 看到这道题我们首先就应该想到有可能是DP和数论,因为题目已经很有特性了(首先题面是放棋子)(然后这一题方案数很多要取模)(而且这一题的数据范围很 ...

  8. bzoj千题计划261:bzoj3294: [Cqoi2011]放棋子

    http://www.lydsy.com/JudgeOnline/problem.php?id=3294 如果一个颜色的棋子放在了第i行第j列,那这种颜色就会占据第i行第j列,其他颜色不能往这儿放 设 ...

  9. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)

    3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...

随机推荐

  1. ReadyAPI 测试工具和创建管理

    通过测试加速API质量APIs 和微服务正在改变组织在数字世界中开展业务的方式,对它们进行测试 比以往任何时候都更加重要 ReadyAPI测试工具是创建.管理.并运行自动化测试REST.SOAP.Gr ...

  2. scrapy-redis的搭建 分布式爬虫 去重

    master:一.spider文件1.需要更改继承的类from scrapy_redis.spiders import RedisSpider 2.注释掉start_urls 3.在爬虫目录下新创建一 ...

  3. 关键字abstract和static总结

    1.  abstract:意为抽象,在Java中可以修饰方法或者类 (1)修饰方法,这个方法是抽象方法,无方法体,这个类一定是抽象类,这个类的子类必须实现这个抽象方法: (2)修饰类,这个类一定是抽象 ...

  4. java基础---设计模式(3)

    行为型模式 出处:http://blog.csdn.net/zhangerqing 行为型模式包括策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式 ...

  5. matlab——线性规划

    @ 目录 前言 一.基本概念 二.matlab实现 1.常用函数 2.常见变形 参考书目 前言 线性规划是数学规划中的一个重要分支,常用于解决如何利用现有资源来安排生产,以取得最大经济效益的问题.本文 ...

  6. 团队开发day04

    通过myurl.openConnection()连接一直连接失败,问题解决: 在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务, 但是如果 ...

  7. 痞子衡嵌入式:了解i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择. 关于 i.MXRT 系列 BootROM 中串行 NOR ...

  8. request - cookie 操作(一)

    from urllib import request#headers 带cookieblog_url = "http://www.renren.com/452057374/profile?r ...

  9. 开源百宝箱《HelloGitHub》第 64 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. HelloGitHub 有实战.教程.黑科技.开源书籍.企业级开源项目,涵盖多种编程 ...

  10. jvm源码解读--15 oop对象详解

    (gdb) p obj $15 = (oopDesc *) 0xf3885d08 (gdb) p * obj $16 = { _mark = 0x70dea4e01, _metadata = { _k ...