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

P8386 [PA2021] Od deski do desk 题解

时间:2024-10-15 21:22:30浏览次数:5  
标签:do leftarrow int 题解 Od times 区间 dp

P8386 [PA2021] Od deski do desk 题解

考虑一个大的序列一定被分成几个区间来删除。朴素的 dp 定义是 \(dp_{i,j}\) 表示前 \(i\) 个数,最后一个数元素是 \(j\) 的方案数。然而这样不仅不好转移,而且设不下状态。不难发现所有值是等价的。考虑这样一个事情:若我们要分出一个新的区间,那么这个区间的前一部分的区间需要同样合法,原序列是一个排列,位置和元素是一一对应的。于是我们只需要知道分割后前面有几个区间合法以及保证区间结尾后的第一个数和新填的数相同。

于是我们设 \(dp_{i,j,0/1}\) 表示前 \(i\) 位,有 \(j\) 个位置使得其位置 \(w_k\) 满足 \([1,w_k]\) 是合法的,当前序列合法与否。

那么 dp 的转移是显然的:

\[\begin{gather*} dp_{i+1,j,1}\leftarrow dp_{i,j,1}\times j\\ dp_{i+1,j+1,0}\leftarrow dp_{i,j,1}\times(m-j)\\ dp_{i+1,j,1}\leftarrow dp_{i,j,0}\times j\\ dp_{i+1,j,0}\leftarrow dp_{i,j,0}\times (m-j) \end{gather*} \]

含义就是选择填和这些位置相同的数或是不同的数,选择 \(j\) 意味着选择了合法的状态,反之亦然。

代码:

#include <bits/stdc++.h>
#define N 3005
#define int long long
#define mod 1000000007
using namespace std;
int n, m;
int dp[N][N][2];
void add(int &x, int y) {
	x += y;
	if (x > mod)
		x -= mod;
}
signed main() {
	cin >> n >> m;
	dp[0][0][1] = 1;
	for (int i = 0; i < n; i++)
		for (int j = 0; j <= n; j++) {
			add(dp[i + 1][j][1], dp[i][j][1] * j % mod);
			add(dp[i + 1][j + 1][0], dp[i][j][1] * (m - j) % mod);
			add(dp[i + 1][j][1], dp[i][j][0] * j % mod);
			add(dp[i + 1][j][0], dp[i][j][0] * (m - j) % mod);
		}
	int ans = 0;
	for (int i = 0; i <= n; i++)
		add(ans, dp[n][i][1]);
	cout << ans << "\n";
	return 0;
}

标签:do,leftarrow,int,题解,Od,times,区间,dp
From: https://www.cnblogs.com/Rock-N-Roll/p/18468504

相关文章

  • Windows刷机-记录UltraSO工具安装错误
    安装镜像刻录U盘工具UltralSO:UltraISO-ISOCD/DVDimagecreator,editor,burner,converterandvirtualCD/DVDemulator-UltraISOdownloadpage下载后使用注册码激活:UltralSO多国语言版注册码 用户名:SteveOlson 注册码:2BEC-ED28-82BB-95D7UltralSO简体中文版注册......
  • Project Euler 638 题解
    q-analog,老玩家集体起立!这也就是说:\[\binom{n+m}{n}_q=\sum_{\pi\inL_{n,m}}q^{area(\pi)}\]结束!#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmod=1e9+7,maxn=2e7+5;intqp(inta,intb,intp=mod){ intres=1; while(b){ i......
  • Docker Compose部署GitLab
    今天我将向你展示如何在一小时内安装GitLab服务器,并在其中运行第一个CI/CD进程。本文是“如何开始使用流行的CI/CD工具”系列文章的一部分。在本文中,我将向你展示如何安装CI/CD工具,以及如何准备基于Maven构建和测试一个简单项目的流程。什么是GitLab?Gitlab是一款......
  • 2024某校新生校队选拔赛题解
    游记某校某院与某院联合培养机制给排了两场讲座,讲完吃饭,讲座时间\(8:00-12:00,\)拖堂\(10\)min,到食堂\(10\)min,吃饭\(30\)min,走回去\(10\)min,打开网址发现时间只够看榜的一看榜我草\(5\)小时连\(4\)个题都做不出来翻题面发现A,L纯签到,B半签到,遂确信成分题解题目链接A验证是......
  • P2480 [SDOI2010] 古代猪文
    简单数学题。显然答案是\(g^{\sum_{d|n}C_n^d}\)。考虑到\(mod\)是质数,所以\(g^{mod-1}\equiv1\pmod{mod}\),那么考虑算出指数模上\(mod-1\)。注意到\(mod-1\)并不是质数,显然可以质因数分解后CRT合并。于是就做完了。Code#include<iostream>#include<ioman......
  • Project Euler 457 题解
    初等数论小题目求\[n^2-3n-1\equiv0\pmod{p^2}\]配方,得到:\[(2n-3)^2\equiv13\pmod{p^2}\]根据亨泽尔引理,只需得到\((2n-3)^2\equiv13\pmod{p}\)的解即可提升到\(p^2\)。这是二次剩余,直接解。单次求解\(O(\logn)\),时间复杂度\(O(n)\)。#include<bits/stdc++.h......
  • CS 520: Introduction to Operating Systems
    CS520:IntroductiontoOperatingSystemsHomeworkAssignment#3Thisassignmentissomewhatopen-ended—startworkingonitassoonasyoucan!Areminder:Youmayworkingroups;however,youmaynotshowanyoneyourcodeorcopyofanypartofanyonee......
  • docker如何建立本地私有仓库,并将docker镜像推到私有仓库
    在Docker中,您可以通过DockerRegistry创建本地私有仓库,并将Docker镜像推送到这个私有仓库。以下是具体步骤:步骤1:启动一个本地Docker私有仓库拉取registry镜像:Docker官方提供了一个registry镜像,可以用来运行私有仓库。首先,您需要从DockerHub拉取这个镜......
  • 【做题记录】Codeforces Round 943 (Div. 3)/CF1968A-F
    【做题记录】CodeforcesRound943(Div.3)/CF1968A-FA暴力枚举即可。B双指针枚举即可,能匹配就匹配。C考虑构造出\(a[1]=1,a[i]=a[i-1]+x[i]\)的数列,发现满足要求。D有个明显的结论,两人最终一定是在某个点上的。于是从起点开始扫一遍,求出到每一个点的距离和路上的分数......
  • TopCoder SRM616 ColorfulCoins 题解
    TopCoderSRM616ColorfulCoins题意给一套货币,保证任意两种货币存在倍数关系且颜色互不相同。已知货币的币值集合,每次可以询问一个金额,给出货币张数最小的表示方案。问最小的询问次数,使得通过已知信息可以对应货币面值和颜色。分析最大的面值问一个\(\inf\)即可。这时只需要......