[PA2021] Od deski do deski 题解

news/2024/10/14 22:06:14

T1 [PA2021] Od deski do deski

发现合法的字符串一定是类似 \(\texttt{aa...aabb...bbcc...cc}\) 的形式,也就是若干个 \(\texttt a\)、若干个 \(\texttt b\) 和若干个 \(\texttt c\) 等组成的形式。如果当前选好的串 \(S_1\) 是合法的,且有另一个合法的串 \(S_2\),那么显然 \(S_1+S_2\)\(S_1+S_2+S_2\) 等等都是合法的。

所以我们有一个 DP:设 \(f_{i,j,0/1}\) 表示当前长度为 \(i\)、后面填 \(j\) 种数可以变成合法的、当前是否合法的方案数。则有转移:

  • 如果当前是合法的,那么把当前的 \(j\) 种数再填一遍依然是合法的,且不会使下一步能填的数增加,故:\(f_{i+1,j,1}=\sum f_{i,j,1}\times j\)
  • 如果当前是合法的,那么把当前剩下的 \(m-j\) 种数填一遍就不合法了,但会使下一步能填的数增加,故:\(f_{i+1,j+1,0}=\sum f_{i,j,1}\times(m-j)\)
  • 如果当前不合法,按照状态,把 \(j\) 种数填一遍就会合法,且不会增加下一步能填的数,故:\(f_{i+1,j,1}=\sum f_{i,j,0}\times j\)
  • 如果当前不合法,把剩下的 \(m-j\) 种数填一遍依然不会合法,且不会增加下一步能填的数,故:\(f_{i+1,j,0}=\sum f_{i,j,0}\times(m-j)\)

答案就是 \(\sum_{j=0}^nf_{n,j,1}\)

#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
using namespace std;char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){int x=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x;
}
template<typename T>
void write(T x,char sf='\n'){if(x<0)putchar('-'),x=~x+1;int top=0;do str[top++]=x%10,x/=10;while(x);while(top)putchar(str[--top]+48);if(sf^'#')putchar(sf);
}
using ll=long long;
constexpr int MAXN=3005,MOD=1e9+7;
int n,m,ans;
int f[MAXN][MAXN][2];
void add(int&x,int y){x=x+y>=MOD?x+y-MOD:x+y;
}int main(){n=read(),m=read();f[1][1][0]=m;for(int i=1;i<=n;++i)for(int j=1;j<=i;++j){add(f[i+1][j][0],(ll)f[i][j][0]*(m-j)%MOD);add(f[i+1][j][1],(ll)f[i][j][0]*j%MOD);add(f[i+1][j][1],(ll)f[i][j][1]*j%MOD);add(f[i+1][j+1][0],(ll)f[i][j][1]*(m-j)%MOD);}for(int i=1;i<=n;++i)add(ans,f[n][i][1]);write(ans);return fw,0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71625.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

odoo18.0 POS微信支付

我们在前面一节中介绍了如何在销售点(Point of Sale)中使用支付宝进行收款/退款,本节我们将介绍如何使用微信支付完成同样的操作。 模块安装 在设置-POS设置-支付终端中开启微信支付:开启之后,系统会自动把微信支付模块安装上,同样地,POS微信的设置也复用的网站应用中的微…

传统题

题面$\quad $ 我们记 \(F(x)\) 为 \(x\) 为真的方案数,\(len\) 为序列最长连续相同子段长度。 $\quad $ 那么就有: \[ans=\sum _{i=1}^{n}F(len=i)*i \]$\quad $ 也就是: \[\sum _{i=1}^{n}F(len>=i) \]$\quad $ 这里可以画个图,发现结果形如三角形,即可得出上式。再改…

AE软件下载安装

Adobe AE安装步骤 2.1准备工作 https://pan.baidu.com/s/1Hdl1gGIpi4LH9zxUflv5DA?pwd=oap4 下载Adobe After Effects安装包并解压。 确保计算机满足软件安装的配置要求。 2.2安装过程 双击安装程序:双击解压后的文件夹中的 set-up安装程序。 更改安装位置:在安装界面点击文…

洛谷P1219八皇后问题

[USACO1.5] 八皇后 Checker Challenge 题目链接 题目描述 一个如下的 \(6 \times 6\) 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。上面的布局可以用序列 \(2\ 4\ 6\ 1\ 3\ 5\) 来描述,…

Stanford CS149 -- Assignment 4: NanoGPT149

作业描述及代码参见:cs149gpt Warm-Up:访问张量 张量/数组都是按行存储的,四维数组可以看作元素为三维数组的数组,元素大小即为三维数组内元素总数,以此类推。 第 1 部分:简单(但不太高效)的注意力机制实现 主要实现两个矩阵乘法和一个 softmax 运算。第 2 部分:块矩阵…

AGC061F 做题记录

link 事实上这是 CSP模拟赛 #36 的 T4。 记 \(a_i,b_i\) 分别为前 \(i\) 个字符中 \(0\) 的个数对 \(n\) 取模后的值,\(1\) 的个数对 \(m\) 取模后的值。那么,记 \(k\) 为序列长度,合法的序列满足:\(\forall 1\le i < j\le k ,\ (a_i, b_i) \not = (a_j, b_j)\)\(a_k = …

消息队列之RabbitMQ

1.初识MQ 在分布式微服务中,不同服务接口之间的调用分为同步调用和异步调用。 使用同步调用有几种问题拓展性差 性能差 级联失败因此在大部分场景,我们使用的都是异步调用。 异步调用方式其实就是基于消息通知的方式,一般包含三个角色:消息发送者:投递消息的人,就是调用方…