【CQOI2011】放棋子

  在一个n行m列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列。有多少种方法? 例如\(,n=m=3\),有两个白棋子和一个灰棋子,下面左边两种方法都是合法的,但右边两种都是非法的。

    

输出答案对\(10^9+9\)取模的结果。

我们设\(f_{i,j,k}\)表示前\(i\)种颜色的棋子,占了\(j\)行\(k\)列的方案数。

转移时,考虑第\(i\)种颜色占了\(j'\)行\(k'\)列的方案数为\(g_{i,j',k'}\)

\[\displaystyle
f_{i,j,k}=\sum f_{i-1,j-j',k-k'}\cdot g_{i,j',k'}\cdot \binom{n-j+j'}{j'}\cdot \binom{m-k+k'}{k'}
\]

考虑求\(g_{i,j',k'}\)。

我们求出最多占了\(j'\)行\(k'\)列的方案数为\(h_{i,j',k'}\)。\(h_{i,j',k'}=\binom{j'\cdot k'}{c_i}\)。\(c_{i}\)就是第\(i\)种颜色的棋子数量。然后容斥一下就好了。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 35
#define C 15 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} const ll mod=1e9+9;
ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=t*t%mod)
if(x&1) ans=ans*t%mod;
return ans;
} int n,m,q;
int size[C];
ll f[N][N][C];
ll g[N][N];
ll fac[N*N],ifac[N*N];
ll c(int n,int m) {return fac[n]*ifac[m]%mod*ifac[n-m]%mod;} void pre(int now) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(i*j>=size[now]) g[i][j]=c(i*j,size[now]);
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
for(int q=1;q<=i;q++) {
for(int k=1;k<=j;k++) {
if(q==i&&k==j) continue ;
g[i][j]=(g[i][j]-g[q][k]*c(i,q)%mod*c(j,k)%mod+mod)%mod;
}
}
}
}
} int main() {
n=Get(),m=Get(),q=Get();
fac[0]=1;
for(int i=1;i<=n*m;i++) fac[i]=fac[i-1]*i%mod;
ifac[n*m]=ksm(fac[n*m],mod-2);
for(int i=n*m-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
for(int i=1;i<=q;i++) size[i]=Get();
f[0][0][0]=1;
for(int i=1;i<=q;i++) {
memset(g,0,sizeof(g));
pre(i);
for(int j=0;j<=n;j++) {
for(int k=0;k<=m;k++) {
if(!f[j][k][i-1]) continue ;
for(int j2=j+1;j2<=n;j2++) {
for(int k2=k+1;k2<=m;k2++) {
if(!g[j2-j][k2-k]) continue ;
(f[j2][k2][i]+=f[j][k][i-1]*g[j2-j][k2-k]%mod*c(n-j,j2-j)%mod*c(m-k,k2-k))%=mod;
}
}
}
}
}
ll ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
(ans+=f[i][j][q])%=mod;
cout<<ans;
return 0;
}

【CQOI2011】放棋子的更多相关文章

  1. BZOJ 3294: [Cqoi2011]放棋子

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ3294: [Cqoi2011]放棋子

    Description   Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm. Output 输出 ...

  9. [CQOI2011]放棋子--DP

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

  10. BZOJ3294: [Cqoi2011]放棋子(计数Dp,组合数学)

    题目链接 解题思路: 发现一个性质,如果考虑一个合法的方案可以将行和列都压到一起,也就是说,在占用行数和列数一定的情况下,行列互换是不会影响答案的,那么考虑使用如下方程: $f[i][j][k]$为占 ...

随机推荐

  1. [PHP] PHP多进程处理tcp连接

    <?php if(($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0) { echo "failed to create s ...

  2. js如何发送wss协议的请求,以及接受服务器返回的数据

    今天遇到问题,以往都是请求http协议的url,现在请求变成了wss的,用以前那种ajax的方式不可以发送和接受.然后查阅相关资料解决了这个问题,在这记录一下解决办法,使用的是websocket. & ...

  3. LNMP 一键安装 yum install php-mcrypt libmcrypt libmcrypt-devel

    centos源不能安装libmcrypt-devel,由于版权的原因没有自带mcrypt的包 有两种方法解决,一种是使用第三方源,这样还可以使用yum来安装,简单方便,坏处是第三方源多少有中不可靠的感 ...

  4. 缓存MEMCACHE php调用(一)

    在项目中,涉及大访问量时,合理的使用缓存能减轻数据库的压力,同时提升用户体验.即在非实时性的需求的前提下,一小段时间内(若干秒),用于显示的数据从缓存中获取的,而不用直接读取数据库,能有效的减少数据库 ...

  5. [HTML/CSS]下拉菜单

    原理:先让下拉菜单隐藏,鼠标移到的时候在显示出来 1>display 无动画效果,图片是秒出 2>opacity 有动画效果,我这里是1S出现,推荐配合绝对定位使用

  6. 洛谷P4591 [TJOI2018]碱基序列(hash dp)

    题意 题目链接 Sol \(f[i][j]\)表示匹配到第\(i\)个串,当前在主串的第\(j\)个位置 转移的时候判断一下是否可行就行了.随便一个能搞字符串匹配的算法都能过 复杂度\(O(|S| K ...

  7. mysql语句执行顺序图示

  8. vivo怎么录屏 手机录制屏幕详细教程

    在手机上我们经常可以刷到许多类似于手机游戏之类的屏幕视频我想肯定会有很多人好奇怎么录制的,今天小编所说的便是教大家如何在安卓手机上进行屏幕录像,下面便是关于vivo怎么录屏的具体操作方法,希望能对你们 ...

  9. Loadrunner 脚本开发-利用web_submit_data函数实现POST请求

    脚本开发-利用web_submit_data函数实现POST请求   by:授客 QQ:1033553122 概述 web_link()和web_url()函数都是页面访问型函数,实现HTTP请求中的 ...

  10. Android项目实战(四十二):启动页优化,去除短暂白屏或黑屏

    大家会发现一个空项目,从手机桌面打开app是秒启动.但是对于自己开发的项目,有时会发现打开app的时候,会有短暂的1秒--2秒的白屏或者黑屏,然后才进入到程序界面. 个人理解为我们自己实现的Appli ...