Description

Input

输入第一行为两个整数n, m, c,即行数、列数和棋子的颜色数。
第二行包含c个正整数,即每个颜色的棋子数。
所有颜色的棋子总数保证不超过nm。
N,M<=30 C<=10 总棋子数有大于250的情况。

Output

输出仅一行,即方案总数除以 1,000,000,009的余数。

Sample Input

4 2 2
3 1

Sample Output

8
 
 
 

$Solution$

20%:爆搜,没甚么技术含量虽然我考场上还是没打对只骗到10分Orz

100%:

考虑dp

设$f[i][j][k]$为前k种颜色的棋子占任意i行j列的方案数

那么这个值肯定是前面一系列值的$\sum$

显然需要枚举两层$0<=l<i\ ,\ 0<=r<j$

之后就可以得到$f[l][r][k-1]$并将其累加

但因为我们设的状态是任意行列

需要在剩下的$n-l$行中选$i-l$行,列的话同理

所以要$*C_{n-l}^{i-l}*C_{m-r}^{j-r}$,

而且如果要转移过去还必须乘上某一种颜色占任意i行j列的方案数

这时设$g[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][a[k]] * C_{n - l} ^ {i - l} * C_{m - r} ^ {j - r}$

正向求g比较困难,我们可以逆向思维,用所有方案数-不合法方案数之和

$g[i][j][k] = C_{i j} ^ {k} - \sum _ {l = 1} ^ {i} \sum _ {r = 1} ^ {j} g[l][r][k] * C_{i}^{l} * C_{j} ^ {r}$

最后统计$ans=\sum _ {i = 1} ^ {n} \sum _ {j = 1} ^ {m} f[i][j][c]$

收获:如果觉得状态设计得当,而缺少转移方程的某一部分时,不妨设一个辅助数组单独考虑。

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
int n,m,c,a[];
const ll mod=1e9+;
ll f[][][],g[][][],ans=,C[][];
int main()
{
scanf("%d%d%d",&n,&m,&c);
for(int i=;i<=c;i++)
scanf("%d",&a[i]);
if(c>min(n,m))
{
puts("");
return ;
}
f[][][]=;C[][]=;
for(int i=;i<=n*m;i++)
{
C[i][]=;
for(int j=;j<=i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%mod;
}
for(int k=;k<=c;k++)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(a[k]>i*j)continue;
ll res=;
g[i][j][a[k]]=C[i*j][a[k]];
for(int l=;l<=i;l++)
for(int r=;r<=j;r++)
if(l<i||r<j)
(res+=C[i][l]*C[j][r]%mod*g[l][r][a[k]]%mod)%=mod;
g[i][j][a[k]]=(g[i][j][a[k]]-res+mod)%mod;
}
for(int k=;k<=c;k++)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int l=;l<i;l++)
for(int r=;r<j;r++)
(f[i][j][k]+=C[n-l][i-l]*C[m-r][j-r]%mod*f[l][r][k-]%mod*g[i-l][j-r][a[k]]%mod)%=mod;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
(ans+=f[i][j][c])%=mod;
cout<<ans<<endl;
return ;
}

[CQOI2011]放棋子 题解(dp+组合数学)的更多相关文章

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

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

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

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

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

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

  4. BZOJ 3294: [Cqoi2011]放棋子(计数dp)

    传送门 解题思路 设\(f[i][j][k]\)表示前\(k\)个颜色的棋子占领了\(i\)行\(j\)列的方案数,那么转移时可以枚举上一个颜色时占领的位置,\(f[i][j][k]=\sum\lim ...

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

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

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

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

  7. BZOJ 3294: [Cqoi2011]放棋子

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

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

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

  9. [CQOI2011]放棋子--DP

    题目描述: 输入格式 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm.N,M<=30 C<=10 ...

随机推荐

  1. pic16f877a的PWM实验学习

    遇到的问题,编译时找不到TRISC.一开始以为头文件中没有定义,发现定义了. 所以是自己创建工程的时候,设备类型选错了. #include <pic.h> __CONFIG(0xFF32) ...

  2. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】01、环境准备

    开发环境 windows+STS(一个针对Spring优化的Eclipse版本)+Maven+SQLServer 环境部署 1.安装SQLServer(使用版本2008R2) 自行安装,此处略过 2. ...

  3. 【Tomcat】2.配置Tomcat服务器端口和HTTPS

    1.修改XML配置文件 找到Tomcat安装目录下的conf文件夹,打开server.xml文件(可以用笔记本打开) 其中有几行代码如下 <Server port="8005" ...

  4. 剑指offer---3、按之字形顺序打印二叉树

    剑指offer---3.按之字形顺序打印二叉树 一.总结 一句话总结: |||-begin 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照 ...

  5. MySQL 关于case when结合group by用时的写法举例

    原表是个员工档案,共583人,但case when结合group by用时,写法不同,其出来的结果也不同 例1: select distinct a.Branch,case when kultur = ...

  6. python学习笔记:操作Excle

    import xlwt #写excel import xlrd #读excel import xlutils #修改excel 一.写操作 1.写Excel import xlwt #写excel,导 ...

  7. activiti7删除流程定义的相关信息

    package com.zcc.activiti02; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...

  8. jsp页面间的传值方法

    JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ...

  9. 2.3 Nginx服务的启停控制

    在Linux平台下,控制Nginx服务的启停有多种方法 2.3.1 Nginx服务的信号控制 在Nginx服务的启停办法中,有一类是通过信号机制来实现的,Nginx服务器的信号控制如下: Nginx服 ...

  10. Lucence使用入门

    参考: https://blog.csdn.net/u014209975/article/details/50525624 https://www.cnblogs.com/hanyinglong/p/ ...