UVALive 7143 Room Assignment(组合数学+DP)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=648&page=show_problem&problem=5155
There are N guests checking in at the front desk of the hotel. 2K (0 ≤ 2K ≤ N) of them are twins.
There are M rooms available. Each room has capacity ci which means how many guests it can hold.
It happens that the total room capacity is N, i.e. c1 + c2 + . . . + cM = N.
The hotel receptionist wonders how many different room assignments to accommodate all guests.
Since the, receptionist cannot tell the two twins in any pair of twins apart, two room assignments are
considered the same if one can be generated from the other by swapping the two twins in each of some
number of pairs. For rooms with capacity greater than 1, it only matters which people are in the room;
they are not considered to be in any particular order within the room.
Input
The first line of the input gives the number of test cases, T. T test cases follow. Each test case starts
with three integers N, M, and K, which indicates the number of guests, the number of rooms, and the
number of pairs of twins. The following line contains M integers, c1, c2, …, cM, which indicates the i-th
room’s capacity.
Output
For each test case, first output one line containing ‘Case #x: y’, where x is the test case number
(starting from 1) and y is the number of different room assignments modulo 1,000,000,007 (109 + 7).
题目大意:有n个颜色的球,其中有k对球颜色相同,别的都是完全不同的。给m个盒子,每个盒子的容量为c[i],有sum{c[i]}=n。问:有多少种姿势可以把n个球全部放入盒子中。
思路:首先这是一条组合计数的动态规划。
用dp[i][r]表示,前i个盒子已经放完了,手上还拿着r对同色球。
设对于状态dp[i][r],在第 i+1 个盒子中,我们要从 r 对同色球中取出 a 对,拿其中一个放入盒子 i+1 ;从剩下的 r-a 对同色球中,拿出 b 对,全部放入盒子 i+1 中;再从其他剩下的未放入盒子的球里面(假设有 sum 个),取 c[i]-a-2*b 个放入睇 i+1 个盒子中。这样便转移到了状态dp[i+1][r-a-b]。
状态转移方程为:dp[i+1][r-a-b] = dp[i][r] * comb(r, a) * comb(r - a, b) * comb(sum - 2 * r, c[i] - a - 2 * b).
其中comb(p, q)表示从 p 个物体中选出 q 个的组合数。
至于在同色球中只选出其中一个球的问题,可以考虑:给两个球强行编号为1、2,然后强行要求1必需放在2的前面,这样就不会产生重复。当我们放入球1之后,球2就与其他普通的球无异了,无需任何处理。
然后预处理一下阶乘及其逆元,利用公式comb(p, q) = p! / q! / (p-q)!,在O(1)时间内求出组合数。
总的时间复杂度为O(mk^3)。
代码(1.252S):
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL; const int MAXN = ;
const int MOD = 1e9 + ; int inv[MAXN], fact[MAXN]; int _inv(int x) {
if(x == ) return ;
return LL(MOD - MOD / x) * _inv(MOD % x) % MOD;
} void init(int n = ) {
fact[] = ;
for(int i = ; i <= n; ++i)
fact[i] = fact[i - ] * LL(i) % MOD;
for(int i = ; i <= n; ++i)
inv[i] = _inv(fact[i]);
} LL comb(int a, int b) {
if(a < b) return ;
return LL(fact[a]) * inv[b] % MOD * LL(inv[a - b]) % MOD;
} int dp[][];
int c[];
int T, n, m, k; int mulmul(LL a, LL b, LL c, LL d) {
return a * b % MOD * c % MOD * d % MOD;
} void update_add(int &a, int b) {
a += b;
if(a >= MOD) a -= MOD;
} int solve() {
memset(dp, , sizeof(dp));
dp[][k] = ;
for(int i = , sum = n; i < m; ++i) {
for(int r = ; r <= k; ++r) if(dp[i][r]) {
if(sum < * r) break;
for(int a = ; a <= r; ++a) {
for(int b = ; b + a <= r; ++b) {
if(c[i + ] - a - * b < ) break;
int t = mulmul(dp[i][r], comb(r, a), comb(r - a, b), comb(sum - * r, c[i + ] - a - * b));
update_add(dp[i + ][r - a - b], t);
}
if(i == m - ) break; /// if i = m - 1 then a must be zero
}
}
sum -= c[i + ];
}
return dp[m][];
} int main() {
init();
//printf("%d\n", comb(10, 1));
scanf("%d", &T);
for(int t = ; t <= T; ++t) {
scanf("%d%d%d", &n, &m, &k);
for(int i = ; i <= m; ++i) scanf("%d", &c[i]);
printf("Case #%d: %d\n", t, solve());
}
}
UVALive 7143 Room Assignment(组合数学+DP)(2014 Asia Shanghai Regional Contest)的更多相关文章
- dp --- 2014 Asia AnShan Regional Contest --- HDU 5074 Hatsune Miku
Hatsune Miku Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5074 Mean: 有m种音符(note),现在要从 ...
- UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- UVALive 7141 BombX(离散化+线段树)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- UVALive 7147 World Cup(数学+贪心)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- UVALive 7139 Rotation(矩阵前缀和)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- UVALive 7146 Defeat the Enemy(贪心+STL)(2014 Asia Shanghai Regional Contest)
Long long ago there is a strong tribe living on the earth. They always have wars and eonquer others. ...
- UVALive 7148 LRIP(树的分治+STL)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- UVaLive 7143 Room Assignment (组合数+DP)
题意:有 n 个客人,m个房间,每个房间可住ci个人,这 n 个人中有 t 对双胞胎,sum{ci} = n 问你有多少种住房方法. 析:计数DP,dp[i][j] 表示前 i 个房间,还剩下 j ...
- HDU 5074 Hatsune Miku 2014 Asia AnShan Regional Contest dp(水
简单dp #include <stdio.h> #include <cstring> #include <iostream> #include <map> ...
随机推荐
- [转]PHP语言的数据库操作函数的理解
就我接触到的R语言以及对数据库的操作来说,基本的操作其实也就是CRUD(Create, Read, Update, Delete). 习惯了之后,对PHP中的MYSQLI操作函数感觉很不适应,查询或者 ...
- ASIHttpRequest 使用理解
开源库:ASIHttpRequest ASIHttpRequest 下载网址:http://github.com/pokeb/asi-http-request 依赖的5个库文件:CFNetwork, ...
- HDU 1392 凸包模板题,求凸包周长
1.HDU 1392 Surround the Trees 2.题意:就是求凸包周长 3.总结:第一次做计算几何,没办法,还是看了大牛的博客 #include<iostream> #inc ...
- 摘要: Linux下which、whereis、locate、find命令的区别
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.这些是从网上找到的资料,因为有时很长时间不会用到,当要用的时候经常弄混了,所以放到这里方便使用. which ...
- Struts2基础数据校验和框架校验
一:三种校验的方式 1.用validate()方法实现数据校验 2.用execute()方法实现数据校验 3.用validateXxx()方法实现数据校验 1.用validate()方法实现数据校验 ...
- C#搜索指定文件夹内的符合要求的文件
下面的列子是文件的模糊查找, 具体功能是:选定文件夹,搜索所有文件命中包含“_bui”字样的shp图层(后缀为.shp)并将信息显示在ListView中.实际应用中可随便修改. 这里采用递归方法进行深 ...
- jQuery基础,定时器,工厂函数
这个星期刚刚学的JQuery,下面我来说说我学的这几个例子 jQuery是JavaScript的一个程序库. Jquery的工厂函数$(): 在Jquery中 $符号等价于jquery,作用是将DOM ...
- WINDOWS SERVER 2008 RD服务器搭建
RD服务器详细名称为:RemoteDesktop Server 远程桌面服务器.但微软觉得这名字很怪诞,所以中文名用:终端服务器来代替这个叫法:TerminalServiceServer 在介绍搭建之 ...
- ArcGIS Server,rest路径输入要素json 格式描述
以下内容只测试了简单线, 在ArcGIS Server 的rest路径下可以对服务进行操作,如Query等,这些操作可以输入json 格式要素描述或运行得到即输出json格式要素描述. 如博客:htt ...
- [Maven]初次实践
都说Maven好,以前一直用ant,这次体验一下. 开始之前,maven给我的印象有2个,一是库依赖管理做得比较好,二是规范了构建编译过程,说白了就是什么目录都规定好了. 好开始安装,解压缩,设置m2 ...