首页 > 其他分享 >[PA2021] Od deski do deski 题解

[PA2021] Od deski do deski 题解

时间:2024-10-14 22:01:06浏览次数:1  
标签:do 题解 sum texttt 合法 deski 当前 种数

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;
}

标签:do,题解,sum,texttt,合法,deski,当前,种数
From: https://www.cnblogs.com/laoshan-plus/p/18466276

相关文章

  • 牛客周赛63部分题解
    比赛地址:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ(nowcoder.com)A.小红的好数#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglongvoidsolve(){lln;cin>>n;if(n>=10&&n<=99......
  • [ABC213G] Connectivity 2 题解
    好好好。我们设当前处理\(i\)的答案,那么最后的图就可以分成两个部分:\(1\)所在的联通块和其他,根据乘法原理,答案就是它们二者方案的乘积。设\(f_s\)表示集合\(s\)中所有点联通时图的情况数,\(g_s\)表示集合\(s\)中所有点不一定联通时图的情况数,则有:\[ans_i=\sum\limits......
  • odoo18.0 POS微信支付
    我们在前面一节中介绍了如何在销售点(PointofSale)中使用支付宝进行收款/退款,本节我们将介绍如何使用微信支付完成同样的操作。模块安装在设置-POS设置-支付终端中开启微信支付:开启之后,系统会自动把微信支付模块安装上,同样地,POS微信的设置也复用的网站应用中的微信支付模块......
  • 题解:P11132 【MX-X5-T4】「GFOI Round 1」epitaxy
    ProblemLink【MX-X5-T4】「GFOIRound1」epitaxy题目描述给你两个正整数\(n,m\)。定义一个\(1\simn\)的排列\(p\)的价值为所有的\(n-m+1\)个长度为\(m\)的连续子串内最大值的最大公因数。(规定单个数的最大公因数为其自身。)请你求出一个在所有\(1\simn\)......
  • 题解:P9137 [THUPC 2023 初赛] 速战速决
    ProblemLink[THUPC2023初赛]速战速决题目描述题意清晰,不再过多赘述。Solution每张不同的卡是等效的。小\(J\)手上的卡牌只有\(2\)种情况:手上没有相同的牌和有相同的牌。情况\(1\):小\(J\)手上的牌等价于\(1\simn\)(但其实没用),令其手上的牌为\(b_1,b_2,\ldo......
  • 题解:P6299 差别
    ProblemLink差别题目描述给定\(a,b,c,d\),求\(p,q,r,s\)使得\(M\)成为非零最小值。Solution\(M\)的表达式很复杂,把式子拆开有\(16\)个\(4\)次项,不难发现这是一个平方和,不断套平方和公式,最后化简成:\[M=|(ap+bq+cr-ds)^2+(-aq+bp+cs+dr)^2|=((a+bi)\times(......
  • 题解:P9743 「KDOI-06-J」旅行
    ProblemLink「KDOI-06-J」旅行题意题目讲的很清楚,不再过多赘述。Solution不难想到\(O(n^2\timesm^2\timesk)\)的做法:定义\(f_{i,j,val,x,y}\)为当前在\((x,y)\)的位置,花费\(val\)元,手上有\(x\)张\(L\)公司的票,\(y\)张\(Z\)公司的票的方案数,至于空间问题......
  • 题解:P1709 [USACO5.5] 隐藏口令 Hidden Password
    ProblemLink[USACO5.5]隐藏口令HiddenPassword题目描述求最小表示法的开头字母在原字符串的位置。Solution最小表示法板子,双指针解决即可。Code#include<iostream>#include<algorithm>#include<string.h>#include<cstring>#include<cmath>#include<cstdio>......
  • [PA2021] Od deski do deski 题解
    好题好题,难者不会会者不难,我是前者。实际上加入就可以合法的数是很好计算的。考虑现在所有前缀合法串后的字符实际上都可以满足条件。容易想到根据是否合法设置状态。设\(f_{i,j}/g_{i,j}\)表示现在填第\(i\)个数,有\(j\)个填了就合法的数,现在的串合法/不合法。那么有转......
  • 题解:P11145 Strange Homura Game
    ProblemLinkStrangeHomuraGame题意让你猜测一个数\(n\),你只能输出两次,每次输出一个数\(x\),返回\(x\bmodn\)。Solution令输入的数为\(A,B\),输出的数为\(a,b\),答案为\(n\)。一开始想的是CRT,但只能询问\(2\)次。发现输入的值是经过\(\bmodn\)的,已知\((A-a)......