码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • NOIP 模拟赛 长寿花 题解


    NOIP 模拟赛 长寿花 题解

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

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

    求方案数 (modp)

    n,m≤106,ai≤5000,∑ni=1ai≤107,p≤109

    sol

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

    设 gi,j 为对于某一行,前 i 个位置用了 j 个颜色方案数。

    gi,j=gi−1,j−1×j+gi−1,j×(j−1)

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

    gi,j=gi−1,j−1+gi−1,j×(j−1)

    那么原来的 gi,j 等于现在的 gi,j×j!

    设 fi,j 为前 i 层,第 i 行放了 j 种颜色的方案数。

    fi,j=gai,j×j!×(Cjm×ai−1∑k=1fi−1,k−fi−1,j)

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

    j!×(mj)=m!(m−j)! ,是可以预处理的。

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

    code

    1. #include
    2. using namespace std;
    3. typedef unsigned long long uLL;
    4. typedef long double LD;
    5. typedef double db;
    6. const int N = 1e6 + 5;
    7. int n, m, a[N], mx, op, vis[N], P;
    8. int f[2][5005], g[5005][5005], fac[N], o[N];
    9. int main() {
    10. scanf("%d%d%d", &n, &m, &P);
    11. fac[0] = 1, o[0] = 1;
    12. 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;
    13. for (int i = 1; i <= n; i++) {
    14. scanf("%d", &a[i]);
    15. mx = max(mx, a[i]);
    16. }
    17. g[0][0] = 1;
    18. for (int i = 1; i <= mx; i++)
    19. for (int j = 1; j <= mx && j <= m; j++)
    20. g[i][j] = (1ll * g[i - 1][j - 1] % P + 1ll * g[i - 1][j] * (j - 1) % P) % P;
    21. f[0][0] = 1;
    22. for (int i = 1, j; i <= n; i++) {
    23. op ^= 1;
    24. memset(f[op], 0, sizeof(f[op]));
    25. for (j = 1; j <= a[i] && j <= m; j++) {
    26. f[op][j] = 1ll * g[a[i]][j] * f[op ^ 1][0] % P * o[j] % P;
    27. 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;
    28. f[op][0] = 1ll * (f[op][0] + f[op][j]) % P;
    29. }
    30. }
    31. printf("%d", 1ll * (f[op][0] + P) % P);
    32. }
  • 相关阅读:
    Docker从认识到实践再到底层原理(五)|Docker镜像
    孟桥版信号与系统学习笔记
    【计算机图形学】期末考试课后习题重点复习(第1-2章)
    实现动态表单的一种思路 | 京东云技术团队
    Java 对象深拷贝工具类
    解构华为云HE2E项目中的容器技术应用
    Linux环境下测试服务器的DDR5内存性能
    kali搭建docker
    个别海康摄像机通过国标GB28181接入EasyCVR,视频无法打开的解决办法
    数商云:解析B2B2C多用户商城系统架构设计思路,开启智能商城新时代
  • 原文地址:https://blog.csdn.net/KonjakuLAF/article/details/126413856
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号