题目链接:https://ac.nowcoder.com/acm/contest/21791/I

思路:dp+组合数学
首先我们考虑对于单独一层长度为l的方案数是多少
那么我们设f[i][j]表示长度为i,选了j种颜色的方案数(先不考虑排列
那么递推式就是
f[i][j]=f[i-1][j-1]+f[i-1][j]*(j-1)
f[i-1][j-1]代表长度为i-1的时候选了j-1种颜色,那么这个时候必须选个新颜色才能达到j种颜色
f[i-1][j]代表前面选了j种颜色,那么之后选颜色的时候只要不跟最后一个颜色重复就好了,那么就是跟前面j-1中颜色重复那么就乘个(j-1)
之后如果要排列的话乘个j的阶乘就好
之后我们再来考虑到第i层恰好选了j种颜色的情况
先不考虑相邻两层颜色集合不同
设dp[i][j]为第i层恰好选了j种颜色的情况
那么dp[i][j]=∑j=1min(L[i−1],m)\sum_{j=1}^{min(L[i-1],m)}∑j=1min(L[i−1],m)​ × (mj)\binom{m}{j}(jm​) × j! × f[L[i]][j]
∑j=1min(L[i−1],m)\sum_{j=1}^{min(L[i-1],m)}∑j=1min(L[i−1],m)​代表前i-1层选了所有颜色的方案数
(mj)\binom{m}{j}(jm​)代表从m个颜色中选j个
之后选了j个颜色进行排列乘上长度为L[i]选了j种颜色的方案数就是dp[i][j](不考虑相邻两层颜色集合不同的情况)
那么如果集合颜色不同呢
我们就可以减去集合颜色相同就是这行选了j种颜色的话上行那肯定不能选j种颜色了
那么就是dp[i][j]-=dp[i-1][j] × j! × f[L[i-1]][j]
可以再弄个滚动数组
之后注意一下取模之类的就好啦

AC代码:

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
ll n,m,mod;
const int N=1e6+10;
ll jc[5050];
ll Cm[5050];
ll L[N];
ll dp[2][5050];
ll f[5050][5050];
ll ans[3];
void init()
{jc[0]=1;for(int i=1; i<=m; i++)jc[i]=(jc[i-1]*i)%mod;Cm[0]=1;for(int i=1; i<=m; i++)Cm[i]=Cm[i-1]*(m-i+1)%mod;return;
}
int main()
{ios::sync_with_stdio(false),cin.tie(0);cin>>n>>m>>mod;init();for(int i=1; i<=n; i++)cin>>L[i];f[0][0]=1;for(int i=1; i<=5000; i++)for(int j=1; j<=i; j++)f[i][j]=(f[i-1][j-1]+f[i-1][j]*(j-1)%mod)%mod;int flag=0;ans[1]=1;for(int i=1; i<=n; i++){for(int j=1; j<=min(m,L[i]); j++){dp[flag][j]=ans[flag^1]*Cm[j]%mod*f[L[i]][j]%mod;//这里没乘j!是因为和C(j,m)约掉了if(j<=L[i-1])dp[flag][j]=(dp[flag][j]-dp[flag^1][j]*jc[j]%mod*f[L[i]][j]%mod+mod)%mod;ans[flag]=(ans[flag]+dp[flag][j])%mod;}flag^=1;ans[flag]=0;}cout<<ans[flag^1];return 0;
}

New Year Garland(dp+组合数学)相关推荐

  1. CodeForces - 336D Vasily the Bear and Beautiful Strings(dp+组合数学)

    题目链接:点击查看 题目大意:给出一个 01 字符串,规定求值的过程如下: 每次选择末尾的两个数字: 如果为 0 0 ,那么替换成一个 1 否则替换成一个 0 循环往复,直至只剩一个数字位置,剩下的数 ...

  2. ZOJ - 4114 Flipping Game(dp+组合数学)

    题目链接:点击查看 题目大意:给出一个长度为 n 的 01 字符串表示 n 个灯泡的状态,1 为点亮,0 为熄灭,现在需要进行 k 轮操作,每轮操作可以选择恰好 m 个位置,将灯泡的状态置反,现在给出 ...

  3. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)

    3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...

  4. ARC 128D - Neq Neq(dp+组合数学+思维)

    链接 题意: 给出你一个长度为n的序列,你可以对其操作使得这个序列发生变化,问一共有多少种? 对于连续的i-1,i,i+1,这三个数如果满足 ai−1!=aia_{i-1}!=a_{i}ai−1​!= ...

  5. 2021牛客多校5 - Double Strings(dp+组合数学)

    题目链接:点击查看 题目大意:给出两个字符串 sss 和 ttt,要求 "一段相同的前缀" + "一个不同的字符(满足s[i]<t[j])"+ " ...

  6. HDU - 4248 A Famous Stone Collector(dp+组合数学)

    题目链接:点击查看 题目大意:给出 n 种不同种类的石子,每种石子的个数是 a[ i ] 个,记 sum 为石子的总数,问用 k ∈ [ 1 ,  sum ] 个石子组成的不同排列组合有多少种 题目分 ...

  7. BBQ Hard dp + 组合数学 + 建模

    传送门 文章目录 题意: 思路: 题意: 有nnn组物品,每组有aia_iai​个肉和bib_ibi​个菜,你可以选择两组物品让后将肉和菜其串在一根串上,问有多少种不同的串法. 两种方法不同当且仅当选 ...

  8. [CQOI2011]放棋子 题解(dp+组合数学)

    Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数. 第二行包含c个正整数,即每个颜色的棋子数. 所有颜色的棋子总数保证不超过nm. N,M<=3 ...

  9. CodeForces 285 E.Positions in Permutations(dp+组合数学)

    Description 定义一个排列的权为满足|pi−i|=1|p_i-i|=1的ii的个数,问长度为nn的排列且权为kk的有多少个 Input 两个整数n,k(1≤n≤1000,0≤k≤n)n,k( ...

  10. [BZOJ1974][Sdoi2010]auction 代码拍卖会(dp+组合数学)

    Address https://www.lydsy.com/JudgeOnline/problem.php?id=1974 Solution 看上去是一个显然的数位 dp ,但是看到 N≤1018N≤ ...

最新文章

  1. web 服务器-Nginx
  2. 线性表的动态顺序存储和实现(C语言实现)【线性表】(4)
  3. 编译mysql 5.7 源码安装常见问题
  4. linux下共享win下文件夹权限问题,通过Samba从Windows向Linux系统传文件权限问题
  5. 将已发送的短信写入短信数据库
  6. 项目实战——高拓展的实时聊天系统
  7. GPM、FY-4A数据下载
  8. 电机正反转的远程计算机控制,plc控制电机正反转原理图
  9. 2010年及以前的微博
  10. 手把手教你做一个APP应用(含源码)
  11. 一只青蛙一次可以跳上1级台阶也可以跳上2级求该青蛙跳上一个n级的台阶总共有多少种跳法
  12. 王者荣耀觉悟系列(简介)
  13. 最短路径之Floyd(弗洛伊德)算法,以及显示完整路径
  14. Lenovo 拯救者15ISK硬件升级
  15. Action Recognition(行为识别)
  16. 极客云上使用anaconda配置python2.7+tensorflow1.8
  17. Vue 引入高德地图 vue-amap
  18. 三星S7手机如何使用屏幕镜像功能
  19. Minecraft 1.16.5模组开发(三十八) 3D盔甲(新)
  20. 免流脚本SAOML二开最新版

热门文章

  1. Win10环境iTunes制作iPhone铃声(2021)
  2. 《海洋测绘十年》序言
  3. Have smaller server identifier, so dropping the connection: (2, 1)
  4. 这样的跳槽理由,会遭HR嫌弃!
  5. 64位系统装32位计算机,32位的cpu能不能装64位系统|cpu是32位的可以装64位系统吗...
  6. 各大浏览器兼容性问题
  7. 适用于您教会的21个最佳教堂WordPress主题(2020)
  8. XSS 工具之 beef
  9. shopnc mysql_ShopNC单用户版/安装mysql
  10. CF888G - Xor-MST(顺带学习Borůvka算法)