C. 放棋子

题目描述

输入格式

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

输出格式

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

样例

样例输入

4 2 2
3 1

样例输出

8

数据范围与提示

30% n,m<=10

一看这数据范围先想到了状压,然后就完戏了…

其实就是个dp,设f[i][j][k]为前k种棋子,放任意i行j列的方案数,设g[i][j][k]为用k个相同颜色的棋子放任意i行j列的方案数,

则f[i][j][k]=f[l][r][k-1]*g[i-l][j-r][num[k]]*C(n-l,i-l)*C(m-r,j-r);   1<=l<=i,1<=r<=j;

即用前k-1种放l行r列并将其固定在左上角,用第k种放剩下的i-l行,j-r列(从剩下的n-l行,m-r列中选)并将其平移固定(这样对dp是没有影响的)。

然后问题来了,g怎么算?

这里要用到一个小小的容斥,g[i][j][k]=C(i*j,k)-(k个相同颜色棋子未占满i行j列的情况数),

为什么是方形的i*j呢?因为黄色区域已经被前k-1种棋子占满,所以绿色区域不可能再放第k种棋子,此时第k中棋子能放的只有蓝色区域。

所以g[i][j][k]=C(i*j,k)-g[l][r][k]*C(i,l)*C(j,r);  1<=l<=i,1<=r<=j (l!=i || r!=j);

∑f[i][j][c]即为所求。

ps.组合数要打表啊,不然会T的……

#include<iostream>
#include<bitset>
#include<cstdio>
#include<cmath>
#define LL long long
#define int LL
#define mod 1000000009
using namespace std;
int n,m,c;LL num[15];
LL jc[910];
LL f[35][35][15],g[35][35][15];
LL C[950][950];
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))void get_C()
{C[0][0]=1;for(int i=1;i<=900;i++){C[i][0]=1;for(int j=1;j<=900;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}
}
#define C(n,m) C[n][m]
inline int read()
{int s=0;char a=getchar();while(a<'0'||a>'9')a=getchar();while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}return s;
}
signed main()
{
//    freopen("in.txt","r",stdin);n=read(),m=read(),c=read();for(int i=1;i<=c;i++)num[i]=read();get_C();for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)for(int o=1;o<=c;o++)if(i*j>=num[o]){for(int l=1;l<=i;l++)for(int r=1;r<=j;r++)if(l!=i||r!=j)g[i][j][o]=(g[i][j][o]+ g[l][r][o]*C(i,l)%mod*C(j,r)%mod )%mod;g[i][j][o]=( (C(i*j,num[o]) - g[i][j][o] )%mod+mod)%mod;}f[0][0][0]=1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=1;k<=c;k++)   {for(int l=0;l<=i;l++)for(int r=0;r<=j;r++)f[i][j][k]=( f[i][j][k] + f[l][r][k-1]*g[i-l][j-r][k]%mod*C(n-l,i-l)%mod*C(m-r,j-r)%mod )%mod;}LL ans=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)ans=(ans+f[i][j][c])%mod;printf("%lld\n",ans%mod);
}

  

转载于:https://www.cnblogs.com/Al-Ca/p/11166702.html

[CQOI2011]放棋子相关推荐

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

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

  2. BZOJ3294 CQOI2011放棋子(动态规划)

    可以看做棋子放在某个位置后该种颜色就占领了那一行一列.行列间彼此没有区别. 于是可以设f[i][j][k]表示前k种棋子占领了i行j列的方案数.转移时枚举第k种棋子占领几行几列.注意行列间是有序的,要 ...

  3. [CQOI2011]放棋子 题解(dp+组合数学)

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

  4. BZOJ4563[Haoi2016]放棋子

    题目描述 Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在 这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子 ...

  5. [BZOJ 4563]放棋子

    [BZOJ 4563]放棋子 题目 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子 ...

  6. 数论三之组合数学Ⅰ-Max-Min Sums,Binomial Coefficient is Fun,Strivore,Bubble Sort,放棋子,LOJ6671,Iroha and a Grid

    组合计数我最爱 Max-Min Sums description solution code Binomial Coefficient is Fun description solution code ...

  7. UVA11134传说中的车(放棋子)

    题意:       给你一个n*n的棋盘,让你在棋盘上放n个棋子,要求是所有棋子不能相互攻击(同行或者同列就会攻击),并且每个棋子都有一个限制,那就是必须在给定的矩形r[i]里,输出每个棋子的位置,s ...

  8. 蓝桥杯 第三届C/C++预赛真题(7) 放棋子(水题)

    今有 6 x 6 的棋盘格.其中某些格子已经预先放好了棋子.现在要再放上去一些,使得:每行每列都正好有3颗棋子.我们希望推算出所有可能的放法.下面的代码就实现了这个功能. 初始数组中,"1& ...

  9. 洛谷 P3182 [HAOI2016]放棋子(错排问题)

    题面 luogu 题解 裸的错排问题 错排问题 百度百科:\(n\)个有序的元素应有\(n!\)个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排:有的叫重排.如,1 2的错 ...

最新文章

  1. 用 Python 写一个天天酷跑,在线摸鱼不烦恼
  2. 浅析网站SEO优化中导航优化的四大技巧!
  3. “分库分表 ?选型和流程要慎重,否则会失控
  4. 中文TeX的编辑环境推荐
  5. unix network programming volume 2 interprocess communications second edition环境搭建出错的处理...
  6. 随机增量法:bzoj 1336 bzoj 1337 最小圆覆盖
  7. 台大李宏毅Machine Learning 2017Fall学习笔记 (7)Introduction of Deep Learning
  8. DN值、地表反射率、 表观反射率、发射率、辐射亮度、亮温名词解释
  9. 剑指offer刷题专栏C++
  10. 【源码之下无秘密】ArrayList:在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
  11. 城市空中交通和无人系统的空中交通管制评估
  12. 关于任意群是否都是可以由其元素生成,及群中心与元素正规化子关系的分析(2009及1997群论真题)
  13. 10万亿的新房市场,为何没有一家现象级的电商?
  14. 仁爱英语听力测试软件,仁爱版七年级下册英语听力|期末测试(一)听力训练
  15. 【智能制造】【APS】数字化智造下APS软件的架构与展望
  16. MCSD 70-483 Programming in C# 知识梳理(1)
  17. 毕业设计英文文献java_计算机专业毕业设计论文外文文献中英文翻译——java对象...
  18. 自采集电脑壁纸网站PHP源码vV2.0+自适应WAP端
  19. TensorFlow2.0 Keras多层感知器模型imdb情感分类
  20. 谁给介绍个客户资料管理和生日提醒的软件?

热门文章

  1. CSS图片重叠效果~秒懂
  2. Vue 新手引导标签
  3. 蓝桥c++2013真题:逆波兰表达式(代码填空题)
  4. ITU-T E.800 有关服务质量(QoS)的术语定义
  5. c语言串的存储操作完整,c语言中关于串的相关知识以及操作
  6. python字符串截取后拼接_Python字符串拼接、截断、搜索、替换,python,截取,查找
  7. AcWing基础算法课Level-2 第四讲 数学知识
  8. html网站地图在线生成,网站地图(sitemap)在线制作工具
  9. quilleditor 字体大小设置_quill-editor如何更改字体配置?
  10. 为什么运行review manager很卡顿_手机明明没坏,为什么声音开到最大依然很小?原来问题在这里...