题意

给出\(n\),\(m\),\(mu\),问有多少个序列组\((A_0,A_1,\dots,A_n)\)满足:

  • 序列\(Ai\)的长度恰好为\(i\)
  • 所有元素均在\([1,m]\)
  • \(A_{i−1}\)是\(A_i\)的子序列
  • \(A_i\)的字典序大于\(A_{i−1}\)

答案模\(mu\)输出。

\(n,k \le 300\)

传送门

思路

又是一道神仙\(dp\)

一个很重要的思路:把数从小往大插入

当我们插入\(i\)时,因为数列中的数都是\(\le i\)的,所以\(i\)插在所有位置都是可以的

例如:\(1323\),考虑插入\(3\)

最前面:\(31323\);一:\(13323\);二:\(13323\);三:\(13233\);四:\(13233\)

不过同时我们也发现:会算重。而且是当插到\(i\)前面的时候

所以我们强行规定相同数一定要插在后面就可以了。

我们记录\(dp[i][j][k]\)表示当前进行到第\(i\)个操作,放到数字\(j\),有\(k\)个数后可以放(注意这意味着有\(k+1\)种,因为开头也是可以放的)。

转移:

  • \(dp[i][j][k - 1]+= dp[i][j][k] (k>0)\)表示这个位置的数后不放
  • \(dp[i][j + 1][i] += dp[i][j][k] (k=0)\)\(j\)已经不能放了,从\(j+1\)新开始放(不存在相同的,所以所有数后都能放)
  • \(dp[i + 1][j][k] += dp[i][j][k]*(k + 1)\) 表示我们放置这个数,放这个数有\(k+1\)中选择。

代码十分简短

参考

#include <bits/stdc++.h>
#define upd(x,y) x=(x+y>=mu?x+y-mu:x+y)
int n,m,mu,dp[305][305][305];
int main(){
scanf("%d%d%d",&n,&m,&mu);
dp[0][1][0]=1;
for (int i=0;i<=n;i++)
for (int j=1;j<=m;j++)
for (int k=i;k>=0;k--){
if (k) upd(dp[i][j][k-1],dp[i][j][k]);
else upd(dp[i][j+1][i],dp[i][j][k]);
upd(dp[i+1][j][k],1ll*dp[i][j][k]*(k+1)%mu);
}
printf("%d",dp[n][m][0]);
}

AGC024E Sequence Growing Hard的更多相关文章

  1. AtCoder - 3962 Sequence Growing Hard

    Problem Statement Find the number of the possible tuples of sequences (A0,A1,…,AN) that satisfy all ...

  2. [AtCoder Grand Contest 024 Problem E]Sequence Growing Hard

    题目大意:考虑 N +1 个数组 {A0,A1,…,AN}.其中 Ai 的长度是 i,Ai 内的所有数字都在 1 到 K 之间. Ai−1 是 Ai 的子序列,即 Ai 删一个数字可以得到 Ai−1. ...

  3. AGC024C Sequence Growing Easy

    题目大意 你开始有一个序列x 它所有项都是0 你有一个操作:x[i]=x[i-1]+1 问你至少几次操作可以让x序列变为给定的a序列 分析 老年人完全不会这种脑子题/kk........ 我们定义b[ ...

  4. Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)

    题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...

  5. 【AtCoder】AGC024

    A - Fairness 如果奇数次是b - a 否则是a - b #include <bits/stdc++.h> #define fi first #define se second ...

  6. 【SPOJ】MGLAR10 - Growing Strings

    Gene and Gina have a particular kind of farm. Instead of growing animals and vegetables, as it is us ...

  7. 【规律】Growing Rectangular Spiral

    Growing Rectangular Spiral 题目描述 A growing rectangular spiral is a connected sequence of straightline ...

  8. oracle SEQUENCE 创建, 修改,删除

    oracle创建序列化: CREATE SEQUENCE seq_itv_collection            INCREMENT BY 1  -- 每次加几个              STA ...

  9. Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...

随机推荐

  1. vue的自定义指令

    点击元素之外触发函数 <template> <div v-clickoutside="clickItemOut"></div> </tem ...

  2. 简单SQL注入试探、二

    DVWA——简单SQL注入小记 今天我们来记录简单的盲注过程 简单的SQL injection(blind) Level:low 登陆后选择SQL Injection(Blind) 能看到这样的界面 ...

  3. 借助Spring工具类如何实现支持数据嵌套的赋值操作

    假设有两个Bean A和B,想将B中的属性赋值到A实体中,可以使用get set来实现,当属性过多时,就会显得很冗余,可以使用spring提供的BeanUtils.copyProperties()来实 ...

  4. 1.关于OSI七层模型和两主机传输过程

    先回顾一下OSI七层模型有啥内容 (OSI模型与TCP/IP模型类似,这里只针对OSI模型展开) OSI参考模型为什么弃用呢?它的分层过于细致了,以至于使网络的体系结构变得复杂臃肿,有使用重叠的嫌疑, ...

  5. Java面试容器,collection,list,set

      1.容器指的是可以容纳其他对象的对象. 2.collection/set/list的联系和区别? (1)collection是Java集合顶级接口,存储一组不唯一,无序的对象: (2)list接口 ...

  6. 剑指Offer编程题(python)——链表

    1.从尾到头打印链表 #输入一个链表,按链表值从尾到头的顺序返回一个ArrayList.class ListNode: def __init__(self, x): self.val = x self ...

  7. Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装

    Ubuntu系统---安NVIDIA 驱动后  CUDA+cuDNN 安装 --------------------------------------------@20190726--------- ...

  8. replace函数实现

    ##replace函数,跟split函数处理类似,比split简单 #coding=gbk ss='** *axx* *bv** *ctt** **dff***' print(ss) result=[ ...

  9. Jupyter的学习

    一 .Jupyter中的魔术命令 %load test.py  :”可以将test.py 中的文件加载到jupyter框中 %matplotlib inline :可以将Matplotlib 的结果嵌 ...

  10. spring boot项目接入xxl-job

    关于分布式任务调度平台XXL-JOB,作者 许雪里 在其发布的中文教程中已经介绍的很清楚了,这里就不做过多的介绍了.按照文档搭建xxl-job,做此纪录. 1.源码下载地址 GitHub:https: ...