原题

Description

赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= =

现在,神庙里有N根排列成一直线的石柱,从1到N标号,长老要求用油漆将这些石柱重新粉刷一遍。赫克托有K桶颜色各不相同的油漆,第i桶油漆恰好可以粉刷Ci根石柱,并且,C1+C2+C3…CK=N(即粉刷N根石柱正好用完所有的油漆)。长老为了刁难赫克托,要求相邻的石柱颜色不能相同。

喜欢思考的赫克托不仅没有立刻开始粉刷,反而开始琢磨一些奇怪的问题,比如,一共有多少种粉刷的方案?

为了让赫克托尽快开始粉刷,请你尽快告诉他答案。

Input

第一行一个正整数T,表示测试数据组数

对于每一组测试数据数据:

第1行:一个正整数K

第2行:K个正整数,表示第i桶油漆可以粉刷的石柱个数,Ci。

Output

对于每组输入数据,输出一行一个整数,表示粉刷的方案数mod 1000000007。

Sample Input

3

3

1 2 3

5

2 2 2 2 2

10

1 1 2 2 3 3 4 4 5 5

Sample Output

10

39480

85937576

Data Constraint

30% N≤10,T≤5N≤10, T≤5

50% N≤15,T≤5N≤15, T≤5

80% K≤15,Ci≤5,T≤500K≤15,Ci≤5,T≤500

100% K≤15,Ci≤6,T≤2000K≤15,Ci≤6,T≤2000

题解

  • 每一步处理一种颜色。

  • 设 F[i][j]F[i][j] 表示涂到第i种颜色,有j对相邻的柱子颜色相同。

  • 记涂到第i种颜色之后一共有 SS 块。

  • 对于 i+1i+1 这种颜色,能粉刷 AA 次。

  • 设把这种颜色分成 kk 块,插进序列里面。

  • 插进的位置中,有 ll 个位置刚好插进在j对颜色相同的柱子中间( l≤\leqj 且 l≤\leqk )。

  • 新状态的 jj:原有的 jj,新增的 A−kA-k,减少的 ll。

  • 状态转移:

    1. 把颜色分成 kk 块的方案数:C(A−1,k−1)C(A-1, k-1)

    2. 把块插进 ll 个位置的方案数:C(j,l)C(j, l)

    3. 剩余块的处理方式:C(S+1−j,k−l)C(S+1-j, k-l)

    4. 转移方程如下:

    5. F[i+1][j+A−k−l]+=F[i][j]∗C(j,l)∗C(A−1,k−1)∗C(S+1−j,k−l)F[i+1][j+A-k-l] += F[i][j] * C(j, l) * C(A-1, k-1) * C(S+1-j, k-l)

    6. 时间复杂度O(K∗N∗C∗C∗T)O(K*N*C*C*T)。(理论复杂度与上一解法一致)

优化

  • 我们看到 T=2000T=2000 这一条件极不和谐。

  • 庆幸的是,将每个询问内的数字打乱顺序不影响答案。

  • 我们可以将每个询问内部进行排序,再按字典序排序之后再处理,顺序处理。

  • 处理询问 i+1i+1 时,保留处理i时的f值。

  • 若询问i与 i+1i+1 的询问前x个数都相等,则对于x之前的f值都是相等的。

  • 由于按字典序排序了,顺序处理会减少大多数的处理。

Code

#include<cstdio>
#include<cstring>
using namespace std;
const int mo=1e9+7,N=91;
long long f[N][N],c[N][N];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
int main()
{c[0][0]=1;for(int i=1;i<N;i++){c[i][i]=c[i][0]=1;for(int j=1;j<i;j++) c[i][j]=c[i-1][j]+c[i-1][j-1];}int T=read();while(T--){int n=read(),m=0;memset(f,0,sizeof(f));f[0][0]=1;for(int i=1;i<=n;i++){int x=read();for(int j=0;j<=m;j++)if(f[i-1][j])for(int k=1;k<=x;k++){int y=(x<j)?x:j;for(int l=0;l<=y;l++)f[i][j-l+x-k]=(f[i][j-l+x-k]+f[i-1][j]*c[x-1][k-1]*c[j][l]%mo*c[m-j+1][k-l])%mo;}m+=x;}printf("%lld\n",f[n][0]);}return 0;
}

【NOIP2013模拟】粉刷匠 题解代码相关推荐

  1. 【GDOI2014模拟】旅行 题解代码

    原题 Description 从前有一位旅者,他想要游遍天下所有的景点.这一天他来到了一个神奇的王国:在这片土地上,有n个城市,从1到n进行编号.王国中有m条道路,第i条道路连接着两个城市ai,bi, ...

  2. bzoj 1296 洛谷4158 [SCOI2009]粉刷匠 题解

    题意简述 一个 n × m n\times m n×m的矩阵,每个位置珂能是粉色(0表示)或者是蓝色(1表示),然后你珂以对同一行里连续一段长度的区间染上一种颜色(覆盖型),你能染 t t t次,每次 ...

  3. jzoj3424. 【NOIP2013模拟】粉刷匠

    Description 赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= = 现在,神庙里有N根排列成一直线的石柱,从1到N标号,长老要求用油漆将这些石柱重新粉刷一遍.赫克托有K桶颜色各不相同的油漆,第i ...

  4. 【NOIP2013模拟】粉刷匠

    文章目录 题目 分析 代码 题目 Description 赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= = 现在,神庙里有NNN根排列成一直线的石柱,从111到NNN标号,长老要求用油漆将这些石柱重新 ...

  5. 【题解】P4158 [SCOI2009]粉刷匠(DP,背包)

    [题解]P4158 [SCOI2009]粉刷匠 是一道资源规划 DP 的好题,但是我想了很久还去看了题解./kk我真菜. 题目链接 P4158 [SCOI2009]粉刷匠 - 洛谷 题意概述 发现自己 ...

  6. JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)

    3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...

  7. 21.2.21 T3 粉刷匠 log P4158 SCOI 2009 总结

    题面 Description "我是一个粉刷匠,粉刷本领强~~~"粉刷匠qjx 哼着小曲高兴地开始了一天的工 作,这天qjx 有 n n n 条木板需要被粉刷.每条木板被分成 m ...

  8. JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)

    3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Det ...

  9. [洛谷P4158][SCOI2009]粉刷匠(动态规划)

    [洛谷P4158][SCOI2009]粉刷匠(动态规划) 题目描述 输入描述 输出描述 示例 输入 输出 题目思路 代码 欢迎关注微信公众号:Java后台开发 题目描述 windy有 N 条木板需要被 ...

最新文章

  1. MySQL☞dual虚拟表
  2. 在线绘图|差异分析——在线做时序分析
  3. 制备pdms膜的方法_“轻若鸿毛”的新型高弹性石墨烯-PDMS传感器
  4. go interface转int_图解go反射实现原理
  5. 客户端序列码生成_[基础]-序列化
  6. __name__ == '__main__'的用法
  7. hashmap put复杂度_集合类HashMap,HashTable,ConcurrentHashMap区别?
  8. nginx限速方法以及报错处理
  9. 浮想联翩后自我脑暴的罗马帝国
  10. java 获取各省市的区号_城市查区号示例代码
  11. 对象可以创建数组吗_淘宝联盟平台可以创建淘礼金吗?相关问题解答
  12. 什么是社会融资规模,M0、M1、M2?
  13. mybatis中获取当前时间_MySQL NOW和SYSDATE函数:获取当前时间日期
  14. uk码对照表_尺码UK5 对应的中国尺码是多少?
  15. android官方模拟器下载安装,网易MuMu模拟器
  16. 学习open62541 --- [58] 使用数据库存储历史数据
  17. SSM 博客系统开发实战
  18. 数据分析之爬虫实例-获取天气AQI数据-附python代码
  19. 梳理 | 机器人学习(Robot Learning)的发展
  20. centos go 连结oracle报ping failed 问题

热门文章

  1. python库——h5py入门讲解
  2. noclobber属性
  3. Python: adb自动化ce'shi
  4. anaconda prompt 执行pip install --upgrade pip 错误解决办法
  5. 迫零响应法用于MIMO系统
  6. 根据二叉树前序遍历和中序遍历重建二叉树
  7. 组会PPT202006220717《双研究步骤的螺旋波等离子体放电结果分析》
  8. 科大星云诗社动态20201211
  9. 云炬随笔20211012(1)
  10. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170408