BZOJ 3294: [Cqoi2011]放棋子
3294: [Cqoi2011]放棋子
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 628 Solved: 238
[Submit][Status][Discuss]
Description
Input
输入第一行为两个整数n, m, c,即行数、列数和棋子的颜色数。第二行包含c个正整数,即每个颜色的棋子数。所有颜色的棋子总数保证不超过nm。
Output
输出仅一行,即方案总数除以 1,000,000,009的余数。
Sample Input
3 1
Sample Output
HINT
N,M<=30 C<=10 总棋子数<=250
Source
分析:
上课不好好听课的我TAT...
此题最重要的思想感觉是补集转化思想...
f[i][j][k]代表前k种颜色占据了i行j列的方案数,那么怎么转移...
f[i][j][k]=Σf[i-x][j-y][k-1]*g[x][y][k]*c[i][x]*c[j][y]
g[x][y][k]代表什么?第k种颜色刚好占据了x行y列...感觉这个转移还是很好想的...
但是问题来了...g[x][y][k]怎么求...
我们可以转化为总方案数减去不合法的方案数,也就是g[i][j][k]=c[i*j][num[k]]-Σg[x][y][k]*c[i][x]*c[j][y]...
注意边界...WA了好几次...QAQ...
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define int long long
using namespace std; const int maxn=+,MOD=1e9+; int n,m,co,ans,num[maxn],c[maxn*maxn][maxn*maxn],f[maxn][maxn][maxn],g[maxn][maxn][maxn]; signed main(void){
memset(f,,sizeof(f));
memset(g,,sizeof(g));
scanf("%lld%lld%lld",&n,&m,&co);
for(int i=;i<=co;i++)
scanf("%lld",&num[i]);
for(int i=;i<=;i++)
c[i][]=c[i][i]=;
for(int i=;i<=;i++)
for(int j=;j<i;j++)
c[i][j]=(c[i-][j-]+c[i-][j])%MOD;
for(int k=;k<=co;k++)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(i*j>=num[k]&&max(i,j)<=num[k]){
g[i][j][k]=c[i*j][num[k]];
for(int x=;x<=i;x++)
for(int y=;y<=j;y++)
if((i-x)||(j-y))
g[i][j][k]=(g[i][j][k]-g[x][y][k]*c[i][x]%MOD*c[j][y]%MOD+MOD)%MOD;
}
f[][][]=;
for(int k=;k<=co;k++)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(i*j>=num[k]){
for(int x=;x<=i;x++)
for(int y=;y<=j;y++)
(f[i][j][k]+=f[i-x][j-y][k-]*g[x][y][k]%MOD*c[i][x]%MOD*c[j][y]%MOD)%=MOD;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
(ans+=f[i][j][co]*c[n][i]%MOD*c[m][j]%MOD)%=MOD;
printf("%lld\n",ans);
return ;
}
by NeighThorn
BZOJ 3294: [Cqoi2011]放棋子的更多相关文章
- BZOJ 3294: [Cqoi2011]放棋子 计数 + 容斥 + 组合
比较头疼的计数题. 我们发现,放置一个棋子会使得该棋子所在的1个行和1个列都只能放同种棋子. 定义状态 $f_{i,j,k}$ 表示目前已使用了 $i$ 个行,$j$ 个列,并放置了前 $k$ 种棋子 ...
- BZOJ 3294: [Cqoi2011]放棋子(计数dp)
传送门 解题思路 设\(f[i][j][k]\)表示前\(k\)个颜色的棋子占领了\(i\)行\(j\)列的方案数,那么转移时可以枚举上一个颜色时占领的位置,\(f[i][j][k]=\sum\lim ...
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...
- bzoj千题计划261:bzoj3294: [Cqoi2011]放棋子
http://www.lydsy.com/JudgeOnline/problem.php?id=3294 如果一个颜色的棋子放在了第i行第j列,那这种颜色就会占据第i行第j列,其他颜色不能往这儿放 设 ...
- bzoj3294[Cqoi2011]放棋子 dp+组合+容斥
3294: [Cqoi2011]放棋子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 755 Solved: 294[Submit][Status] ...
- [CQOI2011]放棋子 (DP,数论)
[CQOI2011]放棋子 \(solution:\) 看到这道题我们首先就应该想到有可能是DP和数论,因为题目已经很有特性了(首先题面是放棋子)(然后这一题方案数很多要取模)(而且这一题的数据范围很 ...
- [洛谷P3158] [CQOI2011]放棋子
洛谷题目链接:[CQOI2011]放棋子 题目描述 在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同 颜色的棋子不能在同一行或者同一列.有多少祌方法?例如,n=m=3,有两个 ...
- P3158 [CQOI2011]放棋子(dp+组合数)
P3158 [CQOI2011]放棋子 放棋子的顺序和方案数无关,所以可以从按颜色递推 设$f[u][p][k]$为放到第$u$种颜色,所剩空间$p*k$的方案数 $g[u][i][j]$表示第$u$ ...
- BZOJ3294: [Cqoi2011]放棋子
Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm. Output 输出 ...
随机推荐
- Source Insight基本使用和快捷键
Source Insight基本使用和快捷键 为什么要用Source Insight呢?貌似是因为比完整的IDE要更快一些,比较利于查看大量的代码. 软件的安装很简单,设置好安装目录. 配置好文档路径 ...
- iOS开发之多媒体API (转载)
视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频 ...
- 阿里云服务器怎么去掉tomcat的8080端口
前言:最近在阿里云申请了一个云服务器,然后已买了一个域名.比如www.haha.com ; 在云服务器上安装了tomcat ,访问服务器就成了 http://www.haha.com:8080/ . ...
- 找window的三种方法
LoginViewController * loginVC = [[LoginViewController alloc]init]; 找window的三种方式 1.// UIWindow * wind ...
- iOS如何获取网络图片(三)有沙盒的
沙盒 沙盒简介 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件 Documents:苹果建议将程序中建立的或在程 ...
- FMDB简单用法
首先引入类库 声明数据库和路径 /** 声明数据库对象 */ @property (nonatomic, strong) FMDatabase *dataBase; /** 声明存储路径 */ ...
- 控制器View的加载和内存警告流程图
控制器View的加载 内存警告
- js去掉字符串前后空格的五种方法
转载 :http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用 function trim(s){ ret ...
- safari浏览器添加书签的方法
说起来自己也是够笨的,竟然找了半天没发现safari的添加书签按钮.为了减少别的朋友遇到这个问题的解决时间. 我做下截图说明,其实就是safari的分享按钮. 希望对你能有所帮助
- js 静态私有变量
特权方法:有权访问私有变量和私有函数的公有方法.在私有作用域中定义私有变量或函数,可以创建特权方法,如下: 示例1 (function(){ //私有变量和私有函数 var privateVariab ...