[CQOI2011]放棋子



$ solution: $

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

但真正实用的还是分析题目性质:这一道题我们仔细读题,可以发现每一种棋子的影响是相对独立的(即我们只需要知道这种颜色的棋子占了多少行列,而不需要知道它占的哪一行那一列)(这个可以画画图自证一下),而且每一种颜色占多少行和多少列也有方案数(我占两行两列,可以用两个棋子,也可以用三个或四个棋子)(而且即使如此,它还是相对独立的)

所以我们不难列出一种DP状态转移,我用 $ f[i][j][k] $ 表示前k种棋子占了i行j列的方案数

$ f[i][j][k] = \sum \limits_{l = 0}^{i - 1} \sum \limits_{r = 0}^{j - 1}f[l][r][k - 1] \times g[i-l][j-r][a[k]] $ (用 a[k] 枚棋子占 (i - l) 行 (j - r) 列的方案数)

$ \times C_{n - l}^{i - l}\times C_{m - r}^{j - r} $ (因为独立,我们可以任选 $ a[k] $ 枚棋子占用的行和列)

但是我们发现这样转移的时候,我们还需要知道(用 a[k] 枚棋子占 (i - l) 行 (j - r) 列的方案数)这个东西其实我们可以在前面就先预处理出来,状态转移十分好写!



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define rg register int using namespace std; const int mod=1e9+9; int n,m,c,ans;
int g[35][35];
int C[905][905];
int f[31][31][11]; inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); m=qr(); c=qr();
for(rg i=0;i<=900;++i)C[i][0]=1;
for(rg i=1;i<=900;++i)
for(rg j=1;j<=i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
f[0][0][0]=1;
for(rg k=1;k<=c;++k){
rg x=qr();
for(rg i=1;i<=n;++i){
for(rg j=1;j<=m;++j){
g[i][j]=0;
if(i*j<x)continue;
g[i][j]=C[i*j][x];
for(rg l=1;l<=i;++l){
for(rg r=1;r<=j;++r){
if(l==i&&r==j)continue;
g[i][j]-=(ll)g[l][r]*C[i][l]%mod*C[j][r]%mod;
if(g[i][j]<mod)g[i][j]+=mod;
}
}
}
}
for(rg i=1;i<=n;++i){
for(rg j=1;j<=m;++j){
for(rg l=0;l<i;++l){
for(rg r=0;r<j;++r){
if((i-l)*(j-r)<x)continue;
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;
if(f[i][j][k]>mod)f[i][j][k]-=mod;
}
}
}
}
}
for(rg i=1;i<=n;++i)
for(rg j=1;j<=m;++j)
(ans+=f[i][j][c])%=mod;
printf("%d\n",ans);
return 0;
}

[CQOI2011]放棋子 (DP,数论)的更多相关文章

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

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

  2. [CQOI2011]放棋子--DP

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

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

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

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

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

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

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

  6. BZOJ 3294: [Cqoi2011]放棋子

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

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

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

  8. BZOJ3294: [Cqoi2011]放棋子

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

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

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

随机推荐

  1. python之tkinter使用-简单对话框

    # 简单对话框,包括字符.整数和浮点数 import tkinter as tk from tkinter import simpledialog def input_str(): r = simpl ...

  2. Python——socketsever模块

    1.作用:同时与多个客户端通信 import socketserver class MyServer(skcketserver.BaseRequestHandler): def handle(self ...

  3. ansible系列4-关闭ssh首次连接时提示

    在ansible配置文件中找到 /etc/ansible/ansible.cfg 方法1 在配置文件中找到 了解到问题原因为,我们了解到进行ssh连接时,可以使用-o参数将StrictHostKeyC ...

  4. ZOJ2836-Number Puzzle-容斥原理

    依次考虑一个数的倍数,两个数的倍数(lcm),三个数的倍数(lcm)... 会发现有这么一个规律,奇数个数时要加上情况数,偶数个数时要减去情况数. 一种只有10个数,用二进制枚举所有情况即可. #in ...

  5. AC自动机-HDU3065-简单题

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 需要记录匹配情况的AC自动机,没有清空一些数组导致wa了几发. /*------------------- ...

  6. Deep Learning(深度学习)学习笔记整理系列二

    声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部 ...

  7. 移除SharePoint2013里的NoteBook笔记本链接

    cls $featureID = (Get-SPFeature | ?{ ($_.DisplayName -eq "SiteNotebook") -and ( $_.Scope - ...

  8. Word Ladder - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Word Ladder - LeetCode 注意点 每一个变化的字母都要在wordList中 解法 解法一:bfs.类似走迷宫,有26个方向(即26个字 ...

  9. display position 和float的作用和关系

    1.传统布局由这三者构成. 2.position设为absolute,那么display一定是block,因此对于span来说,就可以设置高和宽了. 3.position为relative ,那么fl ...

  10. window.open打开页面居中显示

    <script type="text/javascript"> function openwindow(url,name,iWidth,iHeight) { var u ...