NOIP 模拟赛 长寿花 题解

要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件:

  • 同一层两个相邻物品颜色不能相同。
  • 相邻两层颜色集合不能相同。

求方案数 \(\pmod p\)

\(n,m\le 10^6,a_i\le 5000,\sum_{i=1}^n a_i\le 10^7,p\le 10^9\)

sol

由于总颜色数不变,可以先不管选了哪些颜色,最后乘上一个组合即可。

设 \(g_{i,j}\) 为对于某一行,前 \(i\) 个位置用了 \(j\) 个颜色方案数。

\[g_{i,j}=g_{i-1,j-1}\times j + g_{i-1,j}\times (j-1) \]

由于后面需要求组合数,稍加修改这个递推式可以简化实现:

\[g_{i,j}=g_{i-1,j-1} + g_{i-1,j}\times (j-1) \]

那么原来的 \(g_{i,j}\) 等于现在的 \(g_{i,j}\times j!\)

设 \(f_{i,j}\) 为前 \(i\) 层,第 \(i\) 行放了 \(j\) 种颜色的方案数。

\[f_{i,j}=g_{a_i,j}\times j!\times\left(C_m^j\times\sum_{k=1}^{a_{i-1}} f_{i-1,k} -f_{i-1,j}\right) \]

由于有组合数, \(P\) 也不一定是质数,分解质因数麻烦,这就体现修改后的用处了。

\(j!\times\binom{m}{j}=\dfrac{m!}{(m-j)!}\) ,是可以预处理的。

最后, \(f\) 滚掉一维,那个 \(\sum\) 用前缀和。最终复杂度 \(O(\sum a_i)\)

code

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long uLL;
typedef long double LD;
typedef double db;
const int N = 1e6 + 5;
int n, m, a[N], mx, op, vis[N], P;
int f[2][5005], g[5005][5005], fac[N], o[N];
int main() {scanf("%d%d%d", &n, &m, &P);fac[0] = 1, o[0] = 1;for (int i = 1; i <= m; i++) fac[i] = 1ll * fac[i - 1] * i % P, o[i] = 1ll * o[i - 1] * (m - i + 1) % P;for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);mx = max(mx, a[i]);}g[0][0] = 1;for (int i = 1; i <= mx; i++)for (int j = 1; j <= mx && j <= m; j++)g[i][j] = (1ll * g[i - 1][j - 1] % P + 1ll * g[i - 1][j] * (j - 1) % P) % P;f[0][0] = 1;for (int i = 1, j; i <= n; i++) {op ^= 1;memset(f[op], 0, sizeof(f[op]));for (j = 1; j <= a[i] && j <= m; j++) {f[op][j] = 1ll * g[a[i]][j] * f[op ^ 1][0] % P * o[j] % P;if (a[i - 1] >= j) f[op][j] = 1ll * (f[op][j] - 1ll * f[op ^ 1][j] * g[a[i]][j] % P * fac[j] % P) % P;f[op][0] = 1ll * (f[op][0] + f[op][j]) % P;}}printf("%d", 1ll * (f[op][0] + P) % P);
}

NOIP 模拟赛 长寿花 题解相关推荐

  1. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  2. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  3. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  4. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  5. NOIP模拟赛 17.10.10

    初次见面(firstmeet) [题目背景] 雾之湖边,静得可怕. 露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之 湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她 ...

  6. 第十四届蓝桥杯第一期模拟赛试题与题解 C++

    第十四届蓝桥杯第一期模拟赛试题与题解 C++ 试题 A 题解:位运算 试题 B 题解:日历模拟 试题 C 题解:double 求和 试题 D 题解:枚举 试题 E 题解:二维前缀和 试题 F 题解:两 ...

  7. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  8. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  9. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

最新文章

  1. 当Docker遇到Intellij IDEA,再次解放了生产力~
  2. 面试题小记:1、统计字符串出现的次数,2、约瑟夫环问题
  3. listview 滑动以后设置最上面一行为整行展示
  4. 隐藏UITableView当没有数据或数据不够的时候出现的分割线.
  5. CDZSC_2015寒假新人(1)——基础 i
  6. 工作136:eachrt
  7. Hadoop源代码分析(MapReduce概论)
  8. 管理博文Hive大数据-Mysql的安装和启动---大数据之Hive工作笔记0007
  9. 做游戏,学编程(C语言) 4 flappy bird
  10. (转)IDE 而言,是 Xcode 的技术比较先进还是 Visual Studio?
  11. SharePoint 2010版本表
  12. 李宏毅机器学习——无监督学习(五)
  13. 回溯法和树的先序遍历
  14. matlab拟合出余弦曲线,如何用matlab做正弦曲线拟合?
  15. linux nginx rtmp 直播,linux下利用nginx搭建rtmp直播服务
  16. 使用arecord、aplay命令实现音频的采集和播放
  17. 论文笔记(十八):Object Detection and Spatial Location Method for ... Based on 3D Virtual Geographical Scen
  18. 暴漏React配置时报错Remove untracked files, stash or commit any changes, and try again.
  19. CodeFun-UI 设计稿智能生成前端源代码
  20. 【Qt】断言Q_ASSERT的使用

热门文章

  1. const关键字的用法
  2. 指示函数 indicator
  3. 解决typescrip使用xml2js库报错:Module not found: Error: Can‘t resolve ‘timer‘ in ‘‘
  4. javax.websocket 使用指南
  5. Postman模拟后端接口,响应request返回response
  6. 推荐最好的四款Linux/BSD防火墙
  7. 【html】点击图片内链接进行跳转
  8. 双稳态继电器工作原理图_三分钟看懂双稳态电磁阀的工作原理
  9. git 怎么切换分支命令_git 项目切换分支 命令
  10. jvm内存分区和TLAB