ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[题解] ABC172E NEQ

2021-07-13 22:01:58  阅读:180  来源: 互联网

标签:数字 int 题解 leq 序列 ABC172E 错排 dp NEQ


前言

来篇 atcoder 的题解欧~

题目链接

题意

有两个包含 \(n\) 个数字的序列 \(A\) 、 \(B\) ,满足一下条件:

  • \(1\leq A_i,B_i\leq m,(i\in[i,n])\)
  • \(A_i\neq B_i,(i\in[i,n])\)
  • \(A_i\neq A_j(1\leq i<j\leq n)\)

给定 \(n\) , \(m\) ,且 \(n\leq m\) ,求合法的方案数。

两种不同的方案,当且仅当序列 \(A\) 不同或序列 \(B\) 不同。

两个序列不同,当且仅当 \(\forall i,j\leq n,a[i]\neq a[j]\) 。

思路

错排问题的变式。

首先来说明错排问题的递推解法:\(dp[i]=(i-1)(dp[i-1]+dp[i-2])\) 。

其中, \(dp[i]\) 为 \(1\) ~ \(i\) 的错排方案数。

证明:对于第 \(n\) 个加入的数字,有 \(n-1\) 种放发(不能够放在位置 \(n\) 上)。

对于每一个 \(k\) 不与 \(n\) 相等,将 \(n\) 放在位置 \(k\) ,有两种情况。

  • \(k\) 放在位置 \(n\) 上,则相当于不管 \(n\) 和 \(k\) ,然后剩下的 \(n-2\) 个数字错排,有 \(dp[i-2]\) 种情况。
  • \(k\) 没有放在位置 \(n\) 上,因为 \(k\) 不能放在位置 \(n\) 上,所以就相当于不包括数字 \(n\) 的错排,有 \(dp[i-1]\) 种情况。

我们首先固定序列 \(A\) ,选出 \(n\) 个数字,则共有 \(A_m^n\) 种方案。则对于这 \(A_m^n\) 种方案,所选出的 \(B\) 构成的合法方案都不同,那么就只用针对一个典型的案例来进行研究就行了。

则问题就可以转换为:加入 \(n\) 个数字使得这些数字都在 \(1\) ~ \(m\) 内,且互不相同,且满足:\(i\) 不在位置 \(i\) 上,\(i\in[1,n]\)。

我将这个问题称之为“假错排”。

“假错排”就是在上述的情况上加上一种情况:

  • 对于第 \(n\) 个加入的数字,将任意一个数字 \(k(k\in[1,m],k\notin A)\) 填入位置 \(n\) 。

则可以得到状态转移方程:\((m-n)dp[i-1]+(i-1)(dp[i-1]+dp[i-2])\) 。

然后这道题就做完了。

Code

时间复杂度为 \(O(n)\) ,代码很短。

#include <cstdio>
#define int long long
const int MAXN = 5e5 + 5;
const int MOD = 1e9 + 7;
int dp[MAXN], n, m, ans;
signed main() {
	scanf("%lld %lld", &n, &m);
	dp[0] = 1;
	dp[1] = m - n;
	for(int i = 2; i <= n; i++)
		dp[i] = ((m - n) * dp[i - 1] % MOD + (i - 1) * (dp[i - 2] + dp[i - 1]) % MOD) % MOD;
	ans = dp[n];
	for(int i = m, j = 1; j <= n; i--, j++)
		ans = (ans * i) % MOD;
	printf("%lld", ans);
	return 0;
}

标签:数字,int,题解,leq,序列,ABC172E,错排,dp,NEQ
来源: https://www.cnblogs.com/C202202chenkelin/p/15008669.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有