AGC024E Sequence Growing Hard
题意
给出\(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的更多相关文章
- AtCoder - 3962 Sequence Growing Hard
Problem Statement Find the number of the possible tuples of sequences (A0,A1,…,AN) that satisfy all ...
- [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. ...
- AGC024C Sequence Growing Easy
题目大意 你开始有一个序列x 它所有项都是0 你有一个操作:x[i]=x[i-1]+1 问你至少几次操作可以让x序列变为给定的a序列 分析 老年人完全不会这种脑子题/kk........ 我们定义b[ ...
- Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)
题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...
- 【AtCoder】AGC024
A - Fairness 如果奇数次是b - a 否则是a - b #include <bits/stdc++.h> #define fi first #define se second ...
- 【SPOJ】MGLAR10 - Growing Strings
Gene and Gina have a particular kind of farm. Instead of growing animals and vegetables, as it is us ...
- 【规律】Growing Rectangular Spiral
Growing Rectangular Spiral 题目描述 A growing rectangular spiral is a connected sequence of straightline ...
- oracle SEQUENCE 创建, 修改,删除
oracle创建序列化: CREATE SEQUENCE seq_itv_collection INCREMENT BY 1 -- 每次加几个 STA ...
- Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等
功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...
随机推荐
- 关于微信小程序获取多个formId的实现方法
在此之前,很多人使用过form和button的多层嵌套来实现点击一次获取多个formId的目的,如下图所示,点击一次“提交”,可以获取到多个formId 但是在今年3月份,这个投机取巧的方法(算是微信 ...
- selenium小结
1.selenium基本使用 https://www.cnblogs.com/andy9468/p/8976930.html 2.url发生跳转的处理 https://www.cnblogs.com/ ...
- github安全整理
漏洞及渗透练习平台: WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.co ...
- python之闲聊数据类型及常用操作符
Day 1-afternoon 所谓闲聊,也称gossip.下面开始... 整型 python3 的整型与长整型进行了无缝结合,长度不受限制. 浮点型 包括科学计数法 E.(用法同C) 布尔类型 即特 ...
- 安装mysql 好不容易成功了 却连不上
[mysqld] skip-grant-tables datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbo ...
- Java数组复制、遍历、反转
/* 1.数组长度,直接length 即可! 2.min()/max(),需要调用库! 3.数组的复制 ,遍历复制,或者直接命名相等 即可! 4.数组反转时,直接折中即可!对调两重循环麻烦! */ i ...
- Linux系统进程的知识总结,进程与线程之间的纠葛...
来源:嵌入式ARM 当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程. Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行.我 ...
- Selenium(四)使用xpath定位元素
1.什么是xpath: 2.xpath的节点类型 3.xpath的表达式 4.开始定位 浏览器打开本地文件: (python3.7的打开语法) 查找根节点: (绝对路径)查找子节点: 查找type ...
- EL表达式,JSP内置对象
基本语法格式 EL都是以 ${ 为起始.以} 为结尾的 ${ EL Expression} 示例: ${ “Helloworld” } //输出字符串常量 ${ str } //输出字符串变量st ...
- flask读书笔记-flask web开发
在应用启动过程中, Flask 会创建一个 Python 的 logging.Logger 类实例,并将其附属到应用实例上,通过 app.logger 访问 ===================== ...