首页 > 其他分享 >AGC005D ~K Perm Counting 题解

AGC005D ~K Perm Counting 题解

时间:2024-09-15 21:48:53浏览次数:1  
标签:AGC005D int 题解 ll 位置 Perm leq

[AGC005D] ~K Perm Counting 题解

如果一个排列 \(P\) 满足对于所有的 \(i\) 都有 \(|P_i-i|\neq k\),则称排列 \(P\) 为合法的。现给出 \(n\) 和 \(k\),求有多少种合法的排列。由于答案很大,请输出答案对 \(924844033\) 取模的结果。

\(2\leq n\leq 2\times 10^3\),\(1\leq k\leq n-1\)。

正着不好做,考虑容斥,设 \(f_i\) 为至少 \(i\) 个位置 \(|P_i-i|=k\) 的方案数,则答案满足

\[ans=\sum_{i=0}^{n}(-1)^if_i\times (n-i)! \]

现在就是要求 \(f_i\)。可以考虑转化一下模型,我们将一个数 \(i\) 拆分为位置和值两种,将位置 \(i\) 与值 \((i-k),(i+k)\) 连边,值 \(i\) 与位置 \((i-k),(i+k)\) 连边,我们最终可以得到若干个独立的链。

容易发现我们如果选择了一条链上的一条边,假设是位置 \(x\) 到值 \((x+k)\),则说明我们将 \(P_x\) 钦定为 \(x+k\),此时我们就不能在选择值 \((x+k)\) 到位置 \((x+2k)\) 的这条边,因为 \(x+k\) 的值已经被使用了。

总结一下就是我们不能选择一条链上两条相邻的边,然后每选择一条边,相当于有一个位置的数不合法。

那么我们将这些链首尾相连存在一个数组里面,定义 \(dp_{i,j,0/1}\) 为前 \(i\) 个点选了 \(j\) 条边,第 \(i\) 个点是否已经在一条被选择的边上的方案数。转移较为简单,具体见代码。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll P=924844033;
const int N=2003;
ll mul[N],dp[N*2][N*2][2];
int vis[N],lis[N*2],tot,n,k;
int main(){
	scanf("%d%d",&n,&k);
	mul[0]=1;
	for(int i=1;i<=n;++i)mul[i]=mul[i-1]*i%P;
	for(int i=1;i<=n;++i){
		for(int t=1;t<=2;++t){
			if(vis[i]==2)continue;
			for(int j=i;j<=n;j+=k){
				lis[++tot]=j;
				++vis[j];
			}
		}
	}
	dp[0][0][0]=1;lis[0]=-114514;
	for(int i=1;i<=tot;++i){
		for(int j=0;j<=i;++j){
			dp[i][j][0]=(dp[i-1][j][0]+dp[i-1][j][1])%P;
			if(j&&lis[i]-lis[i-1]==k)dp[i][j][1]=dp[i-1][j-1][0];
		}
	}
	ll ans=0;
	for(ll i=0,f=1;i<=n;++i,f=-f){
		ans=(ans+f*(dp[tot][i][0]+dp[tot][i][1])*mul[n-i]%P+P)%P;
	}printf("%lld\n",ans);
	return 0;
}

标签:AGC005D,int,题解,ll,位置,Perm,leq
From: https://www.cnblogs.com/BigSmall-En/p/18415697

相关文章

  • P2602 [ZJOI2010] 数字计数 题解
    数位dp的板子题?显然\([a,b]\)等价于\([0,b]-[0,a]\)。考虑\(dp_{i,j}\)表示到第\(i\)位数字\(j\)的答案。先不考虑数字大小限制(即1到999之类),则显然有\(dp_{i,j}=dp_{i-1,j}\times10+10^{i-1}。当前数字是0时则减去10^{i-1},再减去1。\)所以我们可以预处理出\(dp\),来表示后面......
  • 图:207课程表 题解:入度数组,邻接表,队列,拓扑排序
    207.课程表-力扣(LeetCode)没做出来,参考题解,这篇题解写的非常好。把一个有向无环图转成线性的排序就叫 拓扑排序。(没太懂这句话的意思)classSolution{public:boolcanFinish(intnumCourses,vector<vector<int>>&prerequisites){vector<int>inDegre......
  • 【题解】【动态规划】—— [NOIP2006 普及组] 开心的金明
    【题解】【动态规划】——[NOIP2006普及组]开心的金明[NOIP2006普及组]开心的金明题目描述输入格式输出格式输入输出样例输入#1输出#1提示1.题意解析2.AC代码2.1.二维d......
  • 【题解】【模拟】—— [NOIP2008 普及组] ISBN 号码
    【题解】【模拟】——[NOIP2008普及组]ISBN号码[NOIP2008普及组]ISBN号码题目描述输入格式输出格式输入输出样例输入#1输出#1输入#2输出#2提示1.思路解析2.AC代码[NOIP2008普及组]ISBN号码通往洛谷的传送门题目描述每一本正式出版的图书都有一个I......
  • 【题解】—— [NOIP2011 普及组] 数字反转
    【题解】——[NOIP2011普及组]数字反转[NOIP2011普及组]数字反转题目描述输入格式输出格式输入输出样例输入#1输出#1输入#2输出#2提示1.思路解析2.AC代码[NOIP2011普及组]数字反转通往洛谷的传送门题目描述给定一个整数......
  • 【题解】【枚举】——First Step (ファーストステップ)
    【题解】【枚举】——FirstStepファーストステップFirstStep(ファーストステップ)题目背景题目描述输入格式输出格式输入输出样例输入#1输出#1提示1.思路解析2.AC代码FirstStep(ファーストステップ)原题在洛谷上题目背景我们Aqours,要第一次举办演唱会啦......
  • 【题解】【数组】—— [NOIP2005 普及组] 校门外的树
    【题解】【数组】——[NOIP2005普及组]校门外的树[NOIP2005普及组]校门外的树题目描述输入格式输出格式输入输出样例输入#1输出#1提示1.题意解析2.AC代码[NOIP2005普及组]校门外的树通往洛谷的传送门题目描述某校大门外长度为......
  • 2024ICPC网络赛第一场题解(部分)
    这一场基本纯挂件,给队友翻译翻译题面,帮队友打打板子了,可惜最后40sL题冲了一个\(O(\frac{n^3}{w})\)的bitset最后wa了,所以下面的题解我也只能看着队友代码说说大概,主要参考一下代码吧。A题意给出32个队伍的能力值,和比赛的规则,其中中国队是第一个队伍,问所有分组的情况下,中国队......
  • 1928.规定时间内到达终点的最小话费,题解
    1928.规定时间内到达终点的最小花费-力扣(LeetCode)有点难,参考官方题解代码:利用了动态规划思想,逐步计算从起点到各个城市在不同时间下的最小费用。 1.代码解释,涉及,static关键字,constexpr关键字,INT_MAX除以2赋值的含义staticconstexprintINFTY=INT_MAX/2; 1.**`......
  • Hetao P1391 操作序列 题解 [ 绿 ] [ 二维线性 dp ]
    操作序列:简单的二维dp。观察我们每次操作可以让\(x\)变为\(2x-1\),或者当\(x\)为奇数时让\(x\)变为\(\frac{x+1}{2}\)。显然,执行第一种操作,会使\(x\)变成奇数。那一旦我们连续执行两次操作,\(x\)就会变为:\[\frac{(2x+1)-1}{2}=\frac{2x}{2}=x\]也就是说,当\(x\)......