题目链接:

http://codeforces.com/problemset/problem/140/E

题意:

圣诞树上挂彩球,要求从上到下挂\(n\)层彩球。已知有\(m\)种颜色的球,球的数量不限。

要求结果对\(p\)取模。然后给你\(n\)个数,表示第 \(i\) 根绳长 \(l_i\),也就是要挂 \(l_i\) 个球。

\(1.\)要求每根绳上相邻彩球颜色不同。

\(2.\)相邻的绳子上挂的彩球种类不能相同。

题解:

我们先解决子问题,先考虑第 \(i\) 层上能放多少个球,\(a[i][j]\)表示长为\(i\)的绳子上放\(j\)种球的方案数,考虑的其实就是\(j\)种小球往\(i\)个无编号的盒子里放,每个盒子放一个,相邻盒子小球不一样,

\(a[i−1][j−1]\)表示\(i−1\)个盒子放\(j−1\)种小球,变成 \(i\) 盒子 \(j\)小球,就是新添加一个小球放进一个新的盒子里。

\(a[i−1][j]\)表示\(i−1\)个盒子\(j\)种小球,新添加一个盒子时可以放除了相邻盒子中的小球外任意小球,即 \((j−1)\) 个。

所以,\(a[i][j]=a[i−1][j−1]+a[i−1][j]∗(j−1)\)。显然这就是第二类斯特林数。

我们再考虑 \(dp[i][j]\)表示在第\(1\)到\(i−1\)根绳子排列合法的情况下,第\(i\)根绳子用 \(j\) 种小球的合法方案数。

那么,\(dp[i][j] = \sum\limits_{i = 1}^{m}\sum\limits_{j = 1 }^{l[i]} [dp[i-1][j]*(绳子i上放j 种小球的合法方案数)-(绳子i与绳子i-1用同样小球的方案数)(i > 1)(j <= l[i-1])]\)。

所以,

绳子\(i\)上放\(j\)种小球的合法情况有: \(a[i][j]*A_k^j\) (其中\(k\) 为可以选择的颜色数量)。

绳子\(i\)与绳子\(i-1\)用同样小球的方案数就是:\(dp[i-1][j]*a[i][j]*A_j^j\)。

最后把该预处理的都预处理一下就可以了。

\(dp\) 那个数组好难开。。。最后\(resize\)一下过了....没有\(c++11\)我可能啥都写不出来....

代码:

#include<bits/stdc++.h>

using namespace std;
const double pi = acos(-1.0);
const double eps = 1e-9;
const int maxn = 1001000; int l[maxn],a[5201][5201],fac[5201],rfac[5201];
//int dp[5201][5201];
std::vector<int> dp[maxn]; int main(int argc, char const *argv[]) {
int n,m,p;
std::cin >> n >> m >> p;
int sz = 0 ;
for(int i=1;i<=n;i++) {
std::cin >> l[i];
//sz = max(l[i],sz);
dp[i].resize(l[i]+1);
}
// vector<vector<int>> dp(sz + 1, vector<int>(sz + 1, 0));
fac[0] = 1;
rfac[0] = 1;
for(int i=1;i<=5010;i++) {
fac[i] = 1LL * fac[i-1] * i % p;
rfac[i] = 1LL * rfac[i-1] * (m - i + 1) % p ;
}
a[0][0] = 1;
for(int i=1;i<=5010;i++) {
for(int j=1;j<=i;j++) {
a[i][j] = (a[i-1][j-1] + 1LL * a[i-1][j] * (j-1) % p) % p;
}
}
int sum = 1;
int ans = 0;
for(int i=1;i<=n;i++) {
for(int j=1;j<=l[i];j++) {
dp[i][j] = 1LL * sum * rfac[j] % p * a[l[i]][j] % p;
if(i > 1 && j <= l[i-1]) {
dp[i][j] = (dp[i][j] - 1LL * dp[i-1][j] * a[l[i]][j] % p * fac[j] % p + p) % p;
}
ans = (ans + dp[i][j]) % p;
}
sum = ans;
ans = 0;
}
std::cout << sum << '\n';
return 0;
}

最新文章

  1. java初始化
  2. connect 链接失败: 查找不到 signal
  3. Github的命令清除
  4. CCF认证(1)
  5. Linux:ssh连接服务器很慢
  6. computer repair services in Hangzhou
  7. 青少年如何使用 Python 开始游戏开发
  8. hdu 1047 Integer Inquiry
  9. Core Java 学习笔记——2.基本数据类型&amp;类型转换
  10. poj 2492 并查集
  11. [swustoj 917] K-lucky-number
  12. JQuery EasyUi 扩展combox验证
  13. 深入JDK源码之Arrays类中的排序查找算法(转)
  14. 【CentOS】PostgreSQL安装与设定
  15. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.bw.mapper.BillMapper.getBillList at org.apache.ibatis.binding.MapperMethod$SqlCommand.&lt;init&gt;(MapperMethod.java:225
  16. Ubuntu18.04中安装cuda的记录
  17. Jenkins系列之一——初识
  18. Photoshop 基础一 安装
  19. python3基础之文件对象操作
  20. GDB用法简要整理

热门文章

  1. pip-window安装
  2. OpenJDK源码研究笔记(十一):浅析Javac编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)
  3. The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
  4. TCP连接状态详解
  5. Yahoo!团队:网站性能优化的35条黄金守则(转)
  6. ssh-keygen &amp;&amp; ssh-copy-id 生成管理传输秘钥
  7. cocos2d-x-lua基础系列教程六(lua-table增删改查)
  8. 怎样使用 OneAPM 监控微软 Azure Cloud Service ?
  9. ABAP调用外部WebService
  10. Linux下的led驱动程序,ok6410