题目:

洛谷3158

分析:

某OIer兔崽子的此题代码中的三个函数名:dfs、ddfs、dddfs(充满毒瘤的气息

显然,行与行之间、列与列之间是互相独立的。考虑背包,用\(f[k][i][j]\)表示用前\(k\)种颜色占了\(i\)行\(j\)列的方案数,\(g[i][j]\)表示用颜色\(k\)占据\(i\)行\(j\)列的方案数,\(c[i]\)表示颜色为\(i\)的棋子数,就有如下方程:

\[f[k][i][j]=\sum _{a=0}^i \sum_{b=0}^j f[k-1][i-a][j-b]\times g[a][b]\times C_{n-(i-a)}^a\times C_{m-(j-b)}^b(ab\geq c[i])
\]

\(g[i][j]\)在算的时候注意要减去有空行或空列的情况(枚举有多少行、列不是空的)。注意要\(a=i\)且\(b=j\)的情况要跳过:

\[g[i][j]=C_{ij}^{c[k]}-\sum_{a=0}^i \sum_{b=0}^j g[a][b]\times C_i^a \times C_j^b(ij\geq c[k])
\]

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std; namespace zyt
{
template<typename T>
inline void read(T &x)
{
char c;
bool f = false;
x = 0;
do
c = getchar();
while (c != '-' && !isdigit(c));
if (c == '-')
f = true, c = getchar();
do
x = x * 10 + c - '0', c = getchar();
while (isdigit(c));
if (f)
x = -x;
}
template<typename T>
inline void write(T x)
{
static char buf[20];
char *pos = buf;
if (x < 0)
putchar('-'), x = -x;
do
*pos++ = x % 10 + '0';
while (x /= 10);
while (pos > buf)
putchar(*--pos);
}
typedef long long ll;
const int N = 40, T = 20, p = 1e9 + 9;
int n, m, c, arr[T], C[N * N][N * N], f[T][N][N], g[N][N];
void init()
{
for (int i = 0; i < N * N; i++)
{
C[i][0] = 1;
for (int j = 1; j <= i; j++)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % p;
}
}
int work()
{
init();
read(n), read(m), read(c);
for (int i = 1; i <= c; i++)
read(arr[i]);
f[0][0][0] = 1;
for (int k = 1; k <= c; k++)
{
memset(g, 0, sizeof(g));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (i * j >= arr[k])
{
g[i][j] = C[i * j][arr[k]];
for (int a = 0; a <= i; a++)
for (int b = 0; b <= j; b++)
{
if (a != i || b != j)
g[i][j] = (g[i][j] - (ll)g[a][b] *
C[i][a] % p * C[j][b] % p + p) % p;
}
}
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int a = 1; a <= i; a++)
for (int b = 1; b <= j; b++)
if (a * b >= arr[k])
f[k][i][j] = (f[k][i][j] +
(ll)f[k - 1][i - a][j - b] * g[a][b] % p *
C[n - (i - a)][a] % p * C[m - (j - b)][b]) % p;
}
int ans = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
ans = (ans + f[c][i][j]) % p;
write(ans);
return 0;
}
}
int main()
{
return zyt::work();
}

【BZOJ3294/洛谷3158】[CQOI2011]放棋子(组合数+DP)的更多相关文章

  1. 洛谷P3158 [CQOI2011]放棋子 组合数学+DP

    题意:在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少祌方法? 解法:这道题不会做,太菜了qwq.题解是看洛谷大佬的. 设C是组合数, ...

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

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

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

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

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

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

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

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

  6. 洛谷 P3182 [HAOI2016]放棋子(高精度,错排问题)

    传送门 解题思路 不会错排问题的请移步——错排问题 && 洛谷 P1595 信封问题 这一道题其实就是求对于每一行的每一个棋子都放在没有障碍的地方的方案数. 因为障碍是每行.每列只有一 ...

  7. 洛谷P3182 [HAOI2016]放棋子

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

  8. luogu 3158 [CQOI2011]放棋子

    时隔多日 我又来挑战这道dp. 几个月前给写自闭了.几个月后再来. 首先一个我们能列出来的状态 是以行为转移的 f[i]表示前i行...但是会发现此时列我们控制不了 且棋子的颜色,个数我们也要放到状态 ...

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

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

随机推荐

  1. SQL学习笔记:库和表的创建

    目录 创建和删除数据库 创建和删除表 添加.修改和删除字段 创建和删除数据库 CREATE DATABASE justForLearn; DROP DATABASE justForLearn; 创建和 ...

  2. C语言之自定义__DATE__与__TIME__

    /******************************************************************* * > File Name: 05-ymd.c * &g ...

  3. 1.Zigbee开发学习资源

    http://blog.csdn.net/zhanglianpin/article/details/46907349

  4. Java基础学习总结(78)——Java main方法深入研究学习

    1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7开始就行不通了. 2.main() ...

  5. node.js 发布订阅模式

    //导入内置模块 let EventEmitter = require('events'); let util=require('util'); //Man继承EventEmitter util.in ...

  6. 救命(洛谷 U4525)

    题目背景 XS中学的校长积劳成疾,最终由于无聊而卧病在沙发.需要药(pi)水(gu)拯救他的生活. 题目描述 现在有n种药水,编号分别为1..n,能拯救校长的药水编号为n 每个药水都可以购买到,但有的 ...

  7. Extended symmetrical multiprocessor architecture

    An architecture for an extended multiprocessor (XMP) computer system is provided. The XMP computer s ...

  8. JavaMelody开源系统性能监控

    https://blog.csdn.net/itopme/article/details/8618067

  9. TDSTCPServerTransport 的Filters

    TDSTCPServerTransport 的Filters TDSTCPServerTransport 的 Filter 属性,可以对传递的数据进行加密,压缩,再修改等,有 点注入的概念.默认情况下 ...

  10. Solid Edge如何制作爆炸图

    1 最方便的方式是自动爆炸 点击应用程式-"爆炸-涂彩-动画"   选择要爆炸的对象(默认是顶层组立件),要爆炸的距离(默认系统根据零件大小自动生成距离,你也可以手动设定距离)即可 ...