HDU 4532
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> #define LL __int64
using namespace std;
const LL MOD=1000000007ll; LL C[500][500];
LL Nn[500];
LL dp[50][500]; //表示前i个系,存在j个空位,它左右两个同学是来自同一个系的种数。此时是把同一个系的同学看作是无区别的
//等计算完毕后再乘上阶乘即可。
int stu[50];
/*此题确实是妙,开始时就往容斥想,但很复杂,没能做出来。
题解是利用了是否存在相邻两个同学来自同一个系这个特点来设状态。
*/ void Init(){
Nn[1]=1;
for(int i=2;i<=500;i++)
Nn[i]=(Nn[i-1]*(LL)i)%MOD;
memset(C,0,sizeof(C));
C[0][0]=1ll;
for(int i=1;i<=500;i++){
for(int j=0;j<=i;j++){
if(j==0) C[i][j]=1ll;
else if(j==i) C[i][j]=1ll;
else{
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
}
}
} void slove(int n){
dp[1][stu[1]-1]=1;
int sum=stu[1];
for(int i=2;i<=n;i++){
for(int j=0;j<sum;j++){//前i个系最多有sum个空位(左右来自同一个系的),于是枚举这些空位
for(int k=1;k<=stu[i];k++){//加入第i个系的同学,把这i个同学分块。
for(int h=0;h<=j&&h<=k;h++){//表示前h个块的同学加入到这j个空位中
dp[i][j-h+stu[i]-k]+=(((dp[i-1][j]*C[j][h])%MOD*C[stu[i]-1][k-1])%MOD*C[sum+1-j][k-h])%MOD;
//C[j][h]表示从j个空位中选出h个让其加入
// C[stu[i]-1][k-1]表示如何分块
//C[sum+1-j][k-h]表示将剩余的块加入非j个空位,即左右来自不同系的
//dp[i][j-h+stu[i]-k]当h个空位加入了同学,导致左右同系的空位减少。但明显的,分块的块内同样引入了
//左右同系的空位
dp[i][j-h+stu[i]-k]%=MOD;
}
}
}
sum+=stu[i];
}
LL ans=dp[n][0];
for(int i=1;i<=n;i++){
ans=(ans*Nn[stu[i]])%MOD;
}
printf("%I64d\n",ans);
} int main(){
Init();
int T;
scanf("%d",&T);
int n,t=0;
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&stu[i]);
memset(dp,0,sizeof(dp));
printf("Case %d: ",++t);
slove(n);
}
return 0;
}
HDU 4532的更多相关文章
- HDU 4532 湫秋系列故事——安排座位 (组合+DP)
湫秋系列故事——安排座位 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- [SinGuLaRiTy] 组合数学题目复习
[SinGuLaRiTy] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [CQBZOJ 2011] 计算系数 题目描述 给定一个多项式( ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
随机推荐
- ACM_小凯的排序(字符串)
小凯的排序 Time Limit: 2000/1000ms (Java/Others) Problem Description: 调皮的小凯喜欢排序,拿到什么东西都要排一下序.现在他觉得单一的递增递减 ...
- 更新换代之requests库
好久不更新博客了... 之前的博文都是通过urllib2进行http访问,接下来我要说一个利器啊!requests模块,无法用语言对他进行赞扬了,需要的,有兴趣的,可以去了解下,移步官方中文文档: R ...
- C#通过SqlConnection连接查询更新等操作Sqlserver数据库
Sqlserver数据库连接方式有多种,这里只介绍最常用的通过SqlConnection和Sqlserver数据库用户名和密码验证来进行操作数据库. 数据库连接字符串: string connStri ...
- 01--Java集合知识
一.Java集合概览 Java中集合分2大块,Collection和Map,分别代表不同功能的集合类对象,整体结构图如下: Collection├List│├LinkedList│├ArrayList ...
- 关闭掉eclipse启动的自动更新功能(提高打开eclipse的速度)
- html5——3D案例(立体导航)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CSS——display:flex
Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 设为Flex布局以后,子元素的float.clear和vertical-align属性 ...
- 将MongoDB服务器设置成Windows启动服务(win10)
如题,这个问题也百度了很久,百度还是挺给力的,但是都没能解决问题,后来在大神(原谅我不知道大神叫什么)的指导下,终于设置成功,特分享下设置过程.. MongoDB设置数据库我就不说了...额..算了, ...
- iOS错误报告中关于崩溃地址的分析
http://blog.csdn.net/gaoyp/article/details/46912753 一.错误报告中的三种地址:stack addressload addresssymbol add ...
- Replacing Threads with Dispatch Queues
Replacing Threads with Dispatch Queues To understand how you might replace threads with dispatch que ...