bzoj3294[Cqoi2011]放棋子 dp+组合+容斥
3294: [Cqoi2011]放棋子
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 755 Solved: 294
[Submit][Status][Discuss]
Description

Input
输入第一行为两个整数n, m, c,即行数、列数和棋子的颜色数。第二行包含c个正整数,即每个颜色的棋子数。所有颜色的棋子总数保证不超过nm。
Output
输出仅一行,即方案总数除以 1,000,000,009的余数。
Sample Input
4 2 2
3 1
Sample Output
8
HINT
N,M<=30 C<=10 总棋子数有大于250的情况
很巧妙的dp,状态的定义很好
首先g[k][i][j]表示第k种颜色占据i行j列的方案
占据i行j列,放的棋子数在[max(i,j),i*j]之间
有i*j个格子,选择a[k]个放置,再减去没有完全占据i行j列的情况
然后f[k][i][j]表示前k种颜色占据i行j列
枚举每种颜色占据几行几列,从前一种颜色转移过来
最后统计ans的时候,考虑前p中颜色占据几行几列再乘上组合数
具体转移的看代码
推荐blog
http://blog.csdn.net/Regina8023/article/details/42584227
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define N 35
#define mod 1000000009
using namespace std;
int n,m,p,a[N],c[N*N][N*N];
ll g[N][N][N],f[N][N][N];
int main(){
#ifdef wsy
freopen("data.in","r",stdin);
#else
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
#endif
scanf("%d%d%d",&n,&m,&p);
for(int i=;i<=p;i++)scanf("%d",&a[i]);
for(int i=;i<=n*m;i++)c[i][i]=c[i][]=;
for(int i=;i<=n*m;i++)
for(int j=;j<i;j++)
c[i][j]=(c[i-][j-]+c[i-][j])%mod; for(int k=;k<=p;k++)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(i*j<a[k]||max(i,j)>a[k])continue;
g[k][i][j]=c[i*j][a[k]];
for(int x=;x<=i;x++)
for(int y=;y<=j;y++)
if((i-x)||(j-y))
g[k][i][j]=(mod+g[k][i][j]-g[k][x][y]*c[i][x]%mod*c[j][y]%mod)%mod;
} f[][][]=;
for(int k=;k<=p;k++)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(i*j<a[k])continue;
for(int x=;x<i;x++)
for(int y=;y<j;y++)
f[k][i][j]=(f[k][i][j]+(f[k-][x][y]*g[k][i-x][j-y]%mod*c[i][x]%mod*c[j][y]%mod))%mod;
}
ll ans=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
ans=(ans+f[p][i][j]*c[n][i]%mod*c[m][j]%mod)%mod;
cout<<ans;
return ;
}
bzoj3294[Cqoi2011]放棋子 dp+组合+容斥的更多相关文章
- bzoj千题计划261:bzoj3294: [Cqoi2011]放棋子
http://www.lydsy.com/JudgeOnline/problem.php?id=3294 如果一个颜色的棋子放在了第i行第j列,那这种颜色就会占据第i行第j列,其他颜色不能往这儿放 设 ...
- BZOJ3294: [Cqoi2011]放棋子(计数Dp,组合数学)
题目链接 解题思路: 发现一个性质,如果考虑一个合法的方案可以将行和列都压到一起,也就是说,在占用行数和列数一定的情况下,行列互换是不会影响答案的,那么考虑使用如下方程: $f[i][j][k]$为占 ...
- bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1033 Solved: 480[Submit][Status][ ...
- [CQOI2011]放棋子--DP
题目描述: 输入格式 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm.N,M<=30 C<=10 ...
- BZOJ3294: [Cqoi2011]放棋子
Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm. Output 输出 ...
- BZOJ3294 CQOI2011放棋子(动态规划)
可以看做棋子放在某个位置后该种颜色就占领了那一行一列.行列间彼此没有区别. 于是可以设f[i][j][k]表示前k种棋子占领了i行j列的方案数.转移时枚举第k种棋子占领几行几列.注意行列间是有序的,要 ...
- BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)
题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...
- 【BZOJ3294】放棋子(动态规划,容斥,组合数学)
[BZOJ3294]放棋子(动态规划,容斥,组合数学) 题面 BZOJ 洛谷 题解 如果某一行某一列被某一种颜色给占了,那么在考虑其他行的时候可以直接把这些行和这些列给丢掉. 那么我们就可以写出一个\ ...
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...
随机推荐
- 亚马逊AWS学习——VPC里面几个概念的关系
VPC中涉及几个概念: VPC 子网 路由表 Internet网关 安全组 今天来讲讲这几个概念之间的关系. 1. VPC 说的就是VPC,当然VPC范围是最大的,VPC即virtual privat ...
- 修改MYSQL的默认连接时长
show global variables like 'wait_timeout'; 设置成10小时; set global wait_timeout=36000;
- 【微软大法好】VS Tools for AI全攻略
大家都知道微软在Connect();17大会上发布了VS Tools for AI,旨在提升Visual Studio和VSCode对日益增长的深度学习需求的体验.看了一圈,网上似乎没有一个完整的中文 ...
- apollo1.7.1初探(一)安装apollo、创建并启动broker
Apache Apollo是一个代理服务器,是在ActiveMQ基础上发展而来的,支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets 等多种协议. A ...
- python基础——列表推导式
python基础--列表推导式 1 列表推导式定义 列表推导式能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形 2 列表推导式语法 基本格式如下: [expr for va ...
- hdu1018 Big Number---N!的位数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1018 题目大意: 求n阶乘的位数思路: N的阶乖的位数等于LOG10(N!)=LOG10(1)+.. ...
- 基于vue2.0的一个系统
前言 这是一个用vue做的单页面管理系统,这里只是介绍架子搭建思路 前端架构 沿用Vue全家桶系列开发,主要技术栈:vue2.x+vue-router+vuex+element-ui1.x+axios ...
- glut 深度测试无不起作用问题解决
OpenGL中使用glEnable(GL_DEPTH_TEST)后深度测试没有起作用,发现深度缓冲没有创建.glut库在兼容模式(GL_COMPATIBILITY_PROFILE)下displaymo ...
- springboot快速入门
SpringBoot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再 ...
- python中关于文件的读取和写入
open()和close()方法:使用python的内置函数open()打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写. file object = open(file_name ...