NKOJ 2040 (CQOI 2011)放棋子(递推+容斥原理+组合数)

P2040【CQOI2011】放棋子

问题描述

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

输入格式

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

输出格式

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

样例输入1:

5 2 3
1 1 1

样例输入2:

4 2 2
3 1

样例输入3:

8 8 8
1 1 1 1 1 1 1 1

样例输出1:

0

样例输出2:

8

样例输出3:

625702391

数据范围

编号 1-2 3-5 6-7 8-10
n, m <=4 <=10 <=30 <=30
c <=2 <=5 <=2 <=10
总棋子数 <=5 <=20 <=900 <=250


此题显然考虑递推,关键是如何定状态,关键是要注意到不同颜色的棋子既不在同一行,也不在同一列。

那么对于单一颜色,令 G[k][x][y] 表示将颜色为k的棋子,恰好放在 x 行, y 列中,保证每一行,每一列至少有一个棋子的方案数
那么考虑用容斥原理求解,用 A[k] 表示第 k 种棋子的棋子数,那么有,

G[k][x][y]=CA[k]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值