#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的更多相关文章

  1. HDU 4532 湫秋系列故事——安排座位 (组合+DP)

    湫秋系列故事——安排座位 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  2. [SinGuLaRiTy] 组合数学题目复习

    [SinGuLaRiTy] Copyright (c) SinGuLaRiTy 2017.  All Rights Reserved. [CQBZOJ 2011] 计算系数 题目描述 给定一个多项式( ...

  3. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  5. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  6. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  7. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  8. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

  9. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

随机推荐

  1. tp 3.2 组合查询, 字符串模式查询

    $User = M("User"); // 实例化User对象 $map['id'] = array('neq',1); $map['name'] = 'ok'; $map['_s ...

  2. Java初级面试模拟1

    1.简单介绍一下你的项目,说一下项目有什么模块 2.说说常见的集合有哪些吧 答:Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List ...

  3. scrapy 简单操作

    1.创建一个简单的scrapy项目 scrapy startproject search(项目名称)按照提示cd searchscrapy genspider serachname search.co ...

  4. web.xml里,classpath使用范围

    比如说在web.xml里,配置spring监听. 在标签<param-value>里,classpath指向的配置文件路径应该是在config资源文件夹下的applicationConte ...

  5. 使用UDEV SCSI规则在Oracle Linux上配置ASM

    对于使用ASM管理的磁盘来说,需要一种能够用于一致性标识磁盘设备及其正确的所属关系和权限的手段.在Linux系统中,可以使用ASMLib来执行这项任务,但是这样做的缺点是在操作系统上增加了额外的一层, ...

  6. Http协议详解(转)>>>写的很好

    声明:本片文章非原创,仅供自己学习并分享 内容来源于博客园作者MIN飞翔的HTTP协议详解地址http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html ...

  7. Python随笔-切片

    Python为取list部分元素提供了切片操作,list[begin:end]获取list的[begin,end)区间元素. 可以用负数索引. tuple.str都是list的一种,所以也适用. 可以 ...

  8. 百度之星2017初赛B1006 小小粉丝度度熊

    思路: 考虑到补签卡一定是连续放置才更优,所以直接根据起始位置枚举.预先处理区间之间的gap的前缀和,在枚举过程中二分即可.复杂度O(nlog(n)). 实现: #include <iostre ...

  9. Gradle的属性Property设置与调用

    Gradle在默认情况下已经为Project定义了很多Property: project:Project本身 name:Project的名字 path:Project的绝对路径 description ...

  10. 《Java编程的逻辑》第一部分 编程基础与二进制