Codeforces 140E(排列组合、dp)
要点
- 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数、2.方案数、3.具体染色数。
- 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个位置恰染\(j\)个颜色的模式数,然后再dp出各层之间的转移:\(dp[i][j]\)表示\(i\)层恰染\(j\)个颜色的具体染色数,用上一轮的答案乘上这一层的具体染色数(是\(f[l[i]][j]*A_m^j\))再减去这层和上层重复的。
- 我将染色的阶段分为三个阶段。虽然题目中总是让求方案数但不同的题需要的是不同阶段的方案数。
- 第一阶段是模式数:即如果有三个位置,你决定填充的是“红绿红”和“绿红绿”其实是一样的“模式”。本题预处理的就是模式:\(f[i][j] = f[i-1][j-1]+f[i-1][j]*(j-1)\),意义是前i-1个如果已经有使用过j-1种类型,则这个位置是唯一的(*1);如果前i-1个已经使用过j种类型,则当前的只要和相邻的左边这个不同即可。
- 第二阶段是方案数,即“这个类型用第几个颜色去填充它”,更具体了一些。这时“红绿红”和“绿红绿”就是典型的两种方案。第二阶段的计算方法是:\(f[i][j]*j!\)。之前做的一道题GYM 101933K他官方题解的做法(方法二)就是直接进行第二阶段的记忆化搜索,我用这套理论先递推第一阶段再做第二阶段(乘个阶乘),果然也是对的。
- 第三阶段是具体染色数,即真的给了赤橙黄绿青蓝紫然后选若干个去染,就最最具体的阶段了。计算方法:\(f[i][j]*j!*C_m^j=f[i][j]*A_m^j\)。
- 这些还没说完orz……这题真的想了很久。回到本题,其中扣掉“这层和上层重复的”这里我觉得有必要想一想,扣的方案数是第几阶段的方案数?正解是\(dp[i][j]-dp[i-1][j]*j!*f[l[i]][j]\),为什么是\(j!\)而不是\(A_m^j\)或者\(C_m^j\)呢?因为当你已经计算完上一层的方案数之时,回想数学课学习的排列组合知识,是不是就假定了上一层已经固定了?虽然不知道固定的是谁,但是他已经有了一定了。所以这一层如果跟上一层颜色集重合的话,就是\(1*方案数\),即上一层如果是“红绿”的话,这一层也只有选择“红绿”时才会和它重,所以只扣一份的即可。
#include <cstdio>
const int maxn = 1e6 + 5;
int n, m, p, l[maxn];
int f[5005][5005], A[5005], fac[5005];
int dp[2][5005], ans[2];
void Read() {
scanf("%d %d %d", &n, &m, &p);
for (int i = 1; i <= n; i++)
scanf("%d", &l[i]);
}
void Pre() {
f[0][0] = 1;
for (int i = 1; i <= 5000; i++)
for (int j = 1; j <= i; j++)
f[i][j] = (1LL * f[i - 1][j - 1] + 1LL * f[i - 1][j] * (j - 1) % p) % p;
fac[0] = A[0] = 1;
for (int i = 1; i <= 5000; i++) {
fac[i] = 1LL * fac[i - 1] * i % p;
A[i] = 1LL * A[i - 1] * (m - i + 1) % p;
}
}
void Solve() {
ans[0] = 1;
for (int i = 1; i <= n; i++) {
ans[i & 1] = 0;
for (int j = 1; j <= l[i]; j++) {
dp[i & 1][j] = 1LL * A[j] * f[l[i]][j] % p * ans[(i - 1) & 1] % p;
if (j <= l[i - 1]) {
int out = 1LL * dp[(i - 1) & 1][j] * fac[j] % p * f[l[i]][j] % p;
dp[i & 1][j] = (dp[i & 1][j] - out + p) % p;
}
ans[i & 1] = (ans[i & 1] + dp[i & 1][j]) % p;
}
}
}
int main() {
Read();
Pre();
Solve();
return !printf("%d\n", ans[n & 1]);
}
Codeforces 140E(排列组合、dp)的更多相关文章
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
3193: [JLOI2013]地形生成 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 459 Solved: 223[Submit][Status ...
- nyoj1076-方案数量 【排列组合 dp】
http://acm.nyist.net/JudgeOnline/problem.php?pid=1076 方案数量 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ...
- [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...
- LightOJ1005 Rooks(DP/排列组合)
题目是在n*n的棋盘上放k个车使其不互相攻击的方案数. 首先可以明确的是n*n最多只能合法地放n个车,即每一行都指派一个列去放车. dp[i][j]表示棋盘前i行总共放了j个车的方案数 dp[0][0 ...
- Codeforces Gym 100187D D. Holidays 排列组合
D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...
- Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls 排列组合
C. Kyoya and Colored Balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- HDU 5816 状压DP&排列组合
---恢复内容开始--- Hearthstone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
随机推荐
- 延时加载 lazyload使用技巧
html <img class="lazy" src="images/src_unit.png" data-src="images/index/ ...
- <opengl>使用glu绘制二次曲面
绘制二次曲面通常要以下四步: 1.首先我们创建一个二次方程状态对象 GLUquadricObj *m_pObj; //保存绘图模式.法线模式.法线朝向.纹理等信息 //创建二次方程状态对象 ...
- hdu3739 Anti LIS[最小割]
长度为 n≤1000 的数列 ai,其中最长上升子序列的长度为 s.至少删去多少数使得最长上升子序列的长度小于 s. 其实这题和那个求有多少不重叠LIS是一样答案的. 先放个图. 图丑别说我. 原网络 ...
- 【Lintcode】036.Reverse Linked List II
题目: Reverse a linked list from position m to n. Given m, n satisfy the following condition: 1 ≤ m ≤ ...
- python爬虫知识点详解
python爬虫知识点总结(一)库的安装 python爬虫知识点总结(二)爬虫的基本原理 python爬虫知识点总结(三)urllib库详解 python爬虫知识点总结(四)Requests库的基本使 ...
- 湖南程序设计竞赛赛题总结 XTU 1237 Magic Triangle(计算几何)
这个月月初我们一行三人去湖南参加了ccpc湖南程序设计比赛,虽然路途遥远,六月的湘潭天气燥热,不过在一起的努力之下,拿到了一块铜牌,也算没空手而归啦.不过通过比赛,还是发现我们的差距,希望这几个月自己 ...
- httpmodule VS2012 和 VS2013
http://stackoverflow.com/questions/963545/httpmodule-not-running-with-visual-studio 如果将 httpmodule 配 ...
- Http协议-URI和资源
所有东西都有一个标准化的名字,以帮助人们寻找城市中的各种资源.书籍有ISBN号,公交车有线路号,银行账户有账户编码,人有身份证,街道有街道名称.人们告诉图书馆管理员书籍的ISBN号,他即可找出该书籍的 ...
- posix 正则库程序
使用的是posix 正则库,参考: http://see.xidian.edu.cn/cpp/html/1428.html 执行匹配的时: gcc myreg.c ip.pat 内容: ip.*[0- ...
- Javascript 获取客户端的运营商 IP 地址 等
客户端获取运营商 会弹出安全隐患问题,需要修改IE activx 选项, 非常麻烦,用我的代码可以轻松获取. <script src="JS/jquery-1.4.1.js" ...