Codeforces Round #100 E. New Year Garland (第二类斯特林数+dp)
题目链接:
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;
}
Codeforces Round #100 E. New Year Garland (第二类斯特林数+dp)的更多相关文章
- Codeforces 1528F - AmShZ Farm(转化+NTT+推式子+第二类斯特林数)
Codeforces 题目传送门 & 洛谷题目传送门 神仙题,只不过感觉有点强行二合一(?). 首先考虑什么样的数组 \(a\) 符合条件,我们考虑一个贪心的思想,我们从前到后遍历,对于每一个 ...
- Codeforces 932 E Team Work ( 第二类斯特林数、下降阶乘幂、组合数学 )
题目链接 题意 : 其实就是要求 分析 : 先暴力将次方通过第二类斯特林数转化成下降幂 ( 套路?) 然后再一步步化简.使得最外层和 N 有关的 ∑ 划掉 这里有个技巧就是 将组合数的表达式放到一边. ...
- codeforces 1278F - Cards(第二类斯特林数+二项式)
传送门 解题过程: \(答案=\sum^n_{i=0}*C^i_n*{\frac{1}{m}}^i*{\frac{m-1}{m}}^{n-i}*i^k\) 根据第二类斯特林数的性质\(n^k=\sum ...
- 【CF961G】Partitions(第二类斯特林数)
[CF961G]Partitions(第二类斯特林数) 题面 CodeForces 洛谷 题解 考虑每个数的贡献,显然每个数前面贡献的系数都是一样的. 枚举当前数所在的集合大小,所以前面的系数\(p\ ...
- HDU2643(SummerTrainingDay05-P 第二类斯特林数)
Rank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Gym Gym 101147G 第二类斯特林数
题目链接:http://codeforces.com/gym/101147/problem/G 题意:n个人,去参加k个游戏,k个游戏必须非空,有多少种放法? 分析: 第二类斯特林数,划分好k个集合后 ...
- Gym - 101147G G - The Galactic Olympics —— 组合数学 - 第二类斯特林数
题目链接:http://codeforces.com/gym/101147/problem/G G. The Galactic Olympics time limit per test 2.0 s m ...
- HDU2512 一卡通大冒险 —— 第二类斯特林数
题目链接:https://vjudge.net/problem/HDU-2512 一卡通大冒险 Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- 【BZOJ5093】图的价值(第二类斯特林数,组合数学,NTT)
[BZOJ5093]图的价值(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 单独考虑每一个点的贡献: 因为不知道它连了几条边,所以枚举一下 \[\sum_{i=0}^{n-1}C_{n-1 ...
随机推荐
- Mirai僵尸网络重出江湖
近年数度感染数十万台路由器的僵尸网络程序Mirai,虽然原创者已经落网判刑,但是Mirai余孽却在网络上持续变种,现在安全人员发现,Mirai已经将焦点转向Linux服务器了. 安全公司Netcout ...
- 与TCP/IP协议的初次见面(一)
与TCP/IP协议的初次见面(一) 前言 今下午刚才女朋友那边回来,唉,算是情人节去找她吧,穷屌丝住不起好酒店,住的打折酒店,只是女朋友来姨妈了,万幸啊,牙还疼得不行,这几天光照应她了,没空写博客了. ...
- Oracle HR 例子用户的建立 10g,11g均可
Oracle HR 例子用户的建立 10g,11g均可 先将附件(见文章尾部)上的 10 个 .sql 文件放入这个路径中 : $ORACLE_HOME/demo/schema/human_resou ...
- 使用QML自绘页面导航条
使用QML自绘页面导航条 近期使用QML制作项目,依照要求.须要制作成分页的插件.遗憾的是,QML的控件库Qt Quick都没有现成的控件,于是我尝试着自己实现自绘页面导航条. 原创文章,反对未声明的 ...
- SAR(遥感、卫星) 图像常用数据集
Brazilian Coffee Scenes数据集较小,5MB左右: UC Merced Land Use Dataset(数据集规模较大,300MB+) MSTAR public targets ...
- Linux下ping命令、traceroute命令、tracert命令的使用
Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...
- POJ 1989 贪心
题意: 思路: 从前到后扫一遍 如果k个数都出现过了 ans++ 从当前接着判断 最后答案就是ans+1 //By SiriusRen #include <cstdio> using na ...
- 「HAOI2016」字符合并
「HAOI2016」字符合并 题意: 有一个长度为\(n\)的\(01\)串,你可以每次将相邻的\(k\)个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这\(k\)个字符确定.你 ...
- Webservice银行报文接口设计
Preface: 合理的软件架构设计其好处是不言而喻的,系统具有清晰的软件结构,良好的可扩展性,类的职能单一明确,系统的复杂度底.此前的一个实际项目中总结了些关于OO设计的实际应用,主要是围绕'高 ...
- CSDN-markdown语法之怎样插入图片
文件夹 图片上传方式 插入在线图片 插入本地图片 图片链接方式 行内式图片链接 參考式图片链接 几个问题探讨 问题1:图片上传和图片链接两种方式的差别 问题2:Markdown中怎样指定图片的高和宽? ...