题面

思路

这种题当然要 \(dp\) 啦

设 \(g_{i,j}\) 表示前 \(i\) 个位置用指定的 \(j\) 种颜色装饰(即用颜色 \(1..j\) 来装饰)

那么 \(g_{i,j}=g_{i-1,j}*(j-1)+g_{i-1,j-1}*j\)

前一项表示前 \(i-1\) 用了 \(j\) 种颜色,那么当前位可以用 \(j-1\) 种颜色,因为它和前面一个不能相同

后一项表示前 \(i-1\) 用了 \(j-1\) 种颜色,根据定义,前 \(i-1\) 位用的颜色是 \(1..j-1\),而现在多了一种来用,那么在 \(i\) 这个阶段的前 \(i-1\) 位用 \(j-1\) 种颜色可供选择的方案是 \(\binom{j}{j-1}\),即 \(j\) 种方案。选完后第 \(i\) 位就确定了,那么总的方案就是颜色选择方案乘上 \(g_{i-1,j-1}\),后者可称为排法

再设 \(f_{i,j}\) 表示前 \(i\) 层放了装饰品且第 \(i\) 层选 \(j\) 种颜色的装饰品的方案数

那么 \(f_{i,j}={\sum_{k=1}^{a_{i-1}}f_{i-1,k}*C_{m}^{j}*g_{a_i,j}}-f_{i-1,j}*g_{a_i,j}\)

意思是前 \(i-1\) 层放的方案乘上本层 \(a_i\) 个位置选 \(j\) 种颜色的方案(乘法原理),因为 \(g\) 此前的定义是给定的 \(j\) 种颜色,然而在 \(f\) 中我们可以任意选 \(j\) 种,故要乘上 \(C_{m}^{j}\)

而题中规定本层与上一层颜色去重后的集合不能相同,所以我们再减去 \(f_{i-1,j}*g_{a_i,j}\) 即为前一个式子重复算的数量

而本题更恶心的是模数不一定是质数,所以再算组合数时我们需要质因数分解,加点奇技淫巧避免时间和空间裂开

看我们算 \(C\) 的过程,显然算 \(C_{m}^{j+1}\) 时可以从 \(C_{m}^j\) 处推来

所以我们分解质因数后存的东西不用清零,直接指数该加的加,该减的减

最后快速幂算一下剩下的指数和底数的贡献就行了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. using namespace std;
  5. typedef long long LL;
  6. const int M = 5005;
  7. int n , m , a[1000005] , Mx , o , tot , pr[M] , vis[1000005] , num[1000005] , s[1000005] , cnt;
  8. LL p , g[M][M] , f[3][M] , c[1000005] , sum , ans;
  9. inline void getprime(int m)
  10. {
  11. vis[0] = vis[1] = 1;
  12. for(register int i = 2; i <= m; i++)
  13. {
  14. if (!vis[i]) pr[++tot] = i;
  15. for(register int j = 1; j <= tot && pr[j] * i <= m; j++)
  16. {
  17. vis[pr[j] * i] = 1;
  18. if (i % pr[j] == 0) break;
  19. }
  20. }
  21. }
  22. inline LL fpow(LL x , int y)
  23. {
  24. LL res = 1;
  25. while (y)
  26. {
  27. if (y & 1) res = res * x % p;
  28. y >>= 1 , x = x * x % p;
  29. }
  30. return res;
  31. }
  32. inline void up(int x)
  33. {
  34. for(register int i = 1; i <= tot && pr[i] * pr[i] <= x; i++)
  35. if (x % pr[i] == 0)
  36. {
  37. if (!vis[pr[i]]) vis[pr[i]] = 1 , num[++cnt] = pr[i];
  38. while (x % pr[i] == 0) s[pr[i]]++ , x = x / pr[i];
  39. }
  40. if (x > 1)
  41. {
  42. if (!vis[x]) num[++cnt] = x , vis[x] = 1;
  43. s[x]++;
  44. }
  45. }
  46. inline void down(int x)
  47. {
  48. for(register int i = 1; i <= tot && pr[i] * pr[i] <= x; i++)
  49. if (x % pr[i] == 0)
  50. {
  51. while (x % pr[i] == 0) s[pr[i]]-- , x = x / pr[i];
  52. }
  53. if (x > 1) s[x]--;
  54. }
  55. inline LL getc(int x , int y)
  56. {
  57. LL res = 1;
  58. up(y) , down(x);
  59. for(register int i = 1; i <= cnt; i++)
  60. res = res * fpow((LL)num[i] , s[num[i]]) % p;
  61. return res;
  62. }
  63. int main()
  64. {
  65. freopen("kalanchoe.in" , "r" , stdin);
  66. freopen("kalanchoe.out" , "w" , stdout);
  67. scanf("%d%d%lld" , &n , &m , &p);
  68. for(register int i = 1; i <= n; i++) scanf("%d" , &a[i]) , Mx = max(Mx , a[i]);
  69. g[1][1] = 1;
  70. for(register int i = 2; i <= Mx; i++)
  71. for(register int j = 1; j <= i; j++)
  72. g[i][j] = (g[i - 1][j] * (j - 1) % p + g[i - 1][j - 1] * j % p) % p;
  73. getprime(m + 3);
  74. memset(vis , 0 , sizeof vis);
  75. for(register int i = 1; i <= min(m , Mx); i++) c[i] = getc(i , m - i + 1);
  76. sum = 1;
  77. for(register int i = 1; i <= n; i++)
  78. {
  79. o = 1 - o;
  80. for(register int j = 1; j <= min(a[i] , m); j++)
  81. f[o][j] = ((sum * c[j] % p * g[a[i]][j] % p - f[1 - o][j] * g[a[i]][j] % p) % p + p) % p;
  82. sum = 0;
  83. for(register int j = 1; j <= min(a[i] , m); j++) sum = (sum + f[o][j]) % p;
  84. if (i > 1) for(register int j = a[i] + 1; j <= a[i - 2]; j++) f[o][j] = 0;
  85. }
  86. for(register int i = 1; i <= min(a[n] , m); i++) ans = (ans + f[o][i]) % p;
  87. printf("%lld" , ans);
  88. }

JZOJ 4308.长寿花的更多相关文章

  1. 长寿花:dp

    当然可以打组合数+CRT什么的,但是其实不必那么麻烦. 先讲那个思路,再转化过来吧. 首先可以发现的一个问题:所有颜色之间是没有区别的,所以我们其实并不在意到底是哪几种,我们只需要知道有几种就可以了. ...

  2. [CSP-S模拟测试]:长寿花(DP+组合数)

    题目描述 庭院里有一棵古树.圣诞节到了,我想给古树做点装饰,给他一个惊喜.他会不会喜欢呢?这棵树可以分为$n$层,第$i$层有$a_i$个防治装饰品的位置,有$m$种颜色的装饰品可供选择.为了能让他喜 ...

  3. day01 三级菜单

    知识点: 字典, for 循环,if ...else 嵌套 永辉超市 = { '食品饮料':{ '休闲食品':{ '坚果':['山核桃','腰果'], '炒货':['瓜子','花生'] }, '牛奶' ...

  4. CSPS模拟 52

    我貌似曾经说过我是个只会做水题的巨型辣鸡.. 这次证明我水题都不会做.. T1 平均数 区间数$n^2$ 枚举是不可能了 可是好像没有无用的计算量.. 刚想到这里,此时开考15min 看见天皇比手势说 ...

  5. NOIP模拟 34

    次芝麻,喝喝喝,长寿花! 什么鬼畜题面...一看就不是什么正经出题人 skyh双双双AK了..太巨了... T1 次芝麻 稍稍手玩就能发现分界点以一个优美的方式跳动 然后就愉快地帮次货们次掉了这个题- ...

  6. [NOIP模拟测试34]反思+题解

    不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...

  7. HIT创业感言:只有长寿的企业才有持续价值

    导语:本文将讨论医疗信息化行业中的创业和企业经营问题.笔者创立的南京都昌科技有限公司专做电子病历编辑器控件,已经有3年多,期间辛苦多年,但因为医疗信息化行业的整体发展良好,也能有所成就了,不过革命尚未 ...

  8. [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)

    题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...

  9. [JZOJ NOIP2018模拟10.21]

    考试之前我刚刚领略到了特判的重要性,没想到T2的两个子任务还是写挂了,丢了20分 考试的感觉不行,一路打的都是暴力,正解的思路想到一半就断了推不下去 T1:逛公园 题目链接: https://jzoj ...

  10. [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...

随机推荐

  1. FCOS论文复现:通用物体检测算法

    摘要:本案例代码是FCOS论文复现的体验案例,此模型为FCOS论文中所提出算法在ModelArts + PyTorch框架下的实现.本代码支持FCOS + ResNet-101在MS-COCO数据集上 ...

  2. Python3.9.5安装

    参考教程1:https://www.cnblogs.com/xiaoyanhuo/p/16362875.html 参考教程2:https://www.cnblogs.com/feng18/p/5854 ...

  3. JDK中内嵌JS引擎介绍及使用

    原文: JDK中内嵌JS引擎介绍及使用 - Stars-One的杂货小窝 最近研究阅读这个APP,其主要功能就是通过一个个书源,从而实现移动端阅读的体验 比如说某些在线小说阅读网站,会加上相应的广告, ...

  4. 【SQL知识】SQL中的join操作总结:内连接、外连接(左右全)

    一.含义 基于表之间的共同字段,把来自两个或多个表的行结合起来 二.分类 内连接:join / inner join 外连接:left join / right join / full outer j ...

  5. 【Spark】Day02:Spark-Core:RDD概述、RDD编程(转换算子、Action)、序列化、依赖关系、持久化、数据读取保存、累加器、广播变量、top10、转化率

    总结:https://www.cnblogs.com/qingyunzong/p/8899715.html 一.RDD概述 1.引入:IO流 按行.按字节.字节缓冲 调用read方法读取流,均为惰性加 ...

  6. webShell攻击及防御

    最近公司项目也是经常被同行攻击,经过排查,基本定位都是挂马脚本导致,所以针对webShell攻击做一下记录. 首先简单说下 什么是webShell? 利用文件上传,上传了非法可以执行代码到服务器,然后 ...

  7. Jmeter 函数助手之__time

    接口中需要传入time时,可使用Jmeter 函数助手中的__time函数传入当前时间 格式和参数名称两个字段非必填,当都不填时直接点击生成按钮,得到13位时间戳:按图填写后,得到10位时间戳,获取当 ...

  8. vulnhub靶场之IA: KEYRING (1.0.1)

    准备: 攻击机:虚拟机kali.本机win10. 靶机:IA: KEYRING (1.0.1),下载地址:https://download.vulnhub.com/ia/keyring-v1.01.o ...

  9. Kubernetes 部署 - DevOps CI/CD详细指南

    什么是Kubernetes部署?​ 在此文章中,我们将探索Kubernetes(K8s),结合DigitalOcean Kubernetes集群与Buddy自动化运维系统部署以达到以下列出的目标: 使 ...

  10. Java学习笔记:2022年1月6日

    Java学习笔记:2022年1月6日 摘要:不可变字符串为什么不可变?StringBuffer类与StringBuilder类,字符串操作拾遗,记事本原理,进制转化问题. 目录 Java学习笔记:20 ...