首页 > 其他分享 >CF1861E Non-Intersecting Subpermutations 题解

CF1861E Non-Intersecting Subpermutations 题解

时间:2024-02-08 20:15:56浏览次数:28  
标签:Non int 题解 sum Subpermutations MAXN 序列 dp mod

简要题意

一个长度为 \(n\) 的元素在 \([1,k]\) 的整数序列 \(a\) 的价值定义如下。

  • 初始 \(i=1\),如果 \(a_{i\sim i+k-1}\) 包含了 \(1 \sim k\) 的所有整数,则价值加 \(1\),然后令 \(i=i+k\)。如果没有包含 \(1\sim k\) 的所有整数则 \(i=i+1\),直到 \(i \geq n-k+2\) 时结束。

对于给定的 \(k\),求所有长度为 \(n\) 的序列的价值和。

做法

我们称一个位置 \(x\) 是匹配的,当且仅当在序列中选出的段中包含 \([x-k+1,x]\)。

考虑设计 dp。

设 \(f_i\) 表示长度为 \(i\) 的序列,只存在一个匹配位置,且这个位置为 \(i\) 的方案数。

设 \(F_i\) 表示长度为 \(i\) 的序列,不存在匹配位置的方案数。

设 \(g_i\) 表示长度为 \(i\) 的序列,有一个匹配位置为 \(i\) 的方案数。

设 \(dp_i\) 表示长度为 \(i\) 的序列,有一个匹配位置为 \(i\) 的所有序列的价值和。

不难发现最后的答案就是 \(\sum F_{n-i}dp_i\)。

转移如下。

\[f_i=k!k^{i-k}-\sum_{j=k}^{i-1} f_j k^{\max\{0,i-k-j\}}(\min\{k,i-j\})! \]

考虑用总方案数减去不合法的方案乘上系数就可以得到上述式子。

\[F_i=k^i-\sum_{j=1}^i f_j k^{i-j} \]

依然是考虑用总方案数减去不合法方案数。

\[g_i=\sum_{j=0}^{i-k} g_jf_{i-j} \]

\[dp_i=\sum_{j=0}^{i-k} (g_j+dp_j)f_{i-j} \]

然后就可以在 \(O(n^2)\) 时间内求出答案了。

#include<bits/stdc++.h>

#define ll long long

using namespace std;

const int MAXN = 4004;
const int mod = 998244353;

int n, k, res, p[MAXN];
int f[MAXN], fac[MAXN], ifac[MAXN], dp[MAXN], g[MAXN], F[MAXN];

ll powc[MAXN];

int main(){
	cin >> n >> k; powc[0]=1; fac[0]=1;
	for(int i=1;i<=n;++i) fac[i]=1ll*fac[i-1]*i%mod;
	for(int i=1;i<=n;++i) powc[i]=powc[i-1]*k%mod;
	ll p=1; for(int i=1;i<=k;++i) p=p*i%mod; f[k]=p;
	for(int i=0;i<k;++i) F[i]=powc[i]; F[k]=(powc[k]-f[k]+mod)%mod;
	for(int i=k+1;i<=n;++i){
		f[i]=p*powc[i-k]%mod; int t=i-k+1;
		for(int j=k;j<i;++j){
			if(t<=j) (f[i]-=1ll*f[j]*fac[k-(j-t+1)]%mod-mod)%=mod;
			else (f[i]-=1ll*f[j]*powc[t-j-1]%mod*p%mod-mod)%=mod;
		}
		F[i]=powc[i];
		for(int j=1;j<=i;++j) (F[i]-=1ll*f[j]*powc[i-j]%mod-mod)%=mod;
	}
	dp[0]=0, g[0]=1; ll sum=0;
	for(int i=k;i<=n;++i){
		for(int j=i-k;j>=0;--j){
			(g[i]+=1ll*g[j]*f[i-j]%mod)%=mod;
			(dp[i]+=1ll*(g[j]+dp[j])*f[i-j]%mod)%=mod;
		}
		sum+=1ll*dp[i]*F[n-i]%mod; sum%=mod;
	}
	cout << sum;
	return 0;
}

标签:Non,int,题解,sum,Subpermutations,MAXN,序列,dp,mod
From: https://www.cnblogs.com/OccasionalDreamer/p/18012086

相关文章

  • CF1863F Divide, XOR, and Conquer 题解
    简要题意你有两个指针\(l,r\)初始时\(l=1,r=n\)。你可以操作若干次知道\(l=r\)。每次操作你可以选择一个整数\(k\in[l,r)\),记\(x=\bigoplus_{i=l}^ka_i,y=\bigoplus_{i=k+1}^ra_i\)。如果\(x\leqy\),你可以令\(l=k+1\)。如果\(x\geqy\),你可以令\(r=k\)。......
  • P9663 Permutation on Tree 题解
    考虑枚举一个\(x\in[1,n)\),将\(\leqx\)的看作\(0\),\(>x\)的看作\(1\),那么一个排列的贡献实际上就是\(\sum_{x=1}^{n-1}\sum[[p_i\leqx]+[p_{i+1}>x]=1]\)。那么问题转变为一个给定一棵树,每一个点有权值\(0\)或\(1\),求所有排布方案的贡献之和。设\(f_x\)表示......
  • P9697 Canvas 题解
    首先观察到有一个关键性质是\(1\leqx_i,y_i\leq2\)。那么我们贪心的考虑我们肯定会将\((x,y)=(1,1)\)的在一开始操作,\((x,y)=(2,2)\)的最后操作。也就是说现在没有固定的是\((x,y)=(1,2)\)和\((x,y)=(2,1)\)的。我们不妨令\((x,y)=(1,2)\),然后连边\((l,r)\)。然......
  • P10013 Tree Topological Order Counting 题解
    首先题目里面写了每一个数都有权值,一般这种题只能去想求出每一个的具体方案数,那么也就是我们得求出\(h_{i,j}\)表示在所有合法拓扑序中\(a_i=j\)的方案数。一颗树的拓扑序数量是\(\dfrac{n!}{\prodsiz_i}\),相信大家都知道。因为我们需要保证这一棵树满足拓扑排序的条件,不......
  • P10068 [CCO2023] Line Town 题解
    好题,但是感觉写起来有点屎。题目大意给定一个序列\(a\),你每次可以选择\(i\in[1,n-1]\),交换\(a_i,a_{i+1}\),并且给\(a_i,a_{i+1}\)取相反数。问你最少需要多少次交换才能使得序列非降,可能无解。做法首先考虑给偶数位置初始乘上\(-1\),然后操作变成交换相邻两个数,下面提......
  • CF1706E 题解
    你谷题目传送门CF题目传送门题目大意给定一个\(n\)个点\(m\)条边的无向图,询问\(q\)次,每次询问会指定两个正整数\(l,r\),问要使对于\(l\leqa\leqb\leqr\)的所有\(a,b\)均有路径可以互相到达,最少需要加入前多少条边。思路考虑到每一次询问实质上就是问你在按......
  • [COCI2007-2008#1] ZAPIS 题解
    题目传送门前置知识区间型动态规划思考过程这题也算是一道很经典的问题了(?)。看见\(n\leq200\),不难想到复杂度为\(O(n^3)\)的区间型动态规划。题面中有这么一段话。空串是规则括号序列。如果\(\textttA\)是规则括号序列,那么\(\texttt{(A)[A]{A}}\)都是规则括号......
  • CF1735D Meta-set 题解
    题目大意给定\(n\)张卡牌,每张卡牌有\(k\)个属性,第\(i\)张卡牌的第\(j\)个属性为\(c_{i,j}\)。一个由\(3\)张卡牌\(x,y,z\)组成的集合被称作好的,当且仅当对于\(1\leqi\leqk\)均有\(c_{x,i}=c_{y,i}=c_{z,i}\)或者\(c_{x,i},c_{y,i},c_{z,i}\)两两不相等。......
  • CF1793E Velepin and Marketing 题解
    题目大意有\(n\)个读者,第\(i\)年他们要一起读\(k_i\)本书,每一本书至少要让一个人读,每一个人也只能读恰好一本书。如果某一个人\(j\),如果有\(a_j\)个人这一年里和他读了同一本书,那么他就会感到满足。对于所有的\(q\)组询问,每组给定一个\(k_i\),求感到满足的人数的最......
  • CF1735E House Planning 题解
    题目大意一条直线上有\(n\)个房子和两个人,房子的坐标\(d_1,d_2,d_3\dotsd_n\),以及两个人坐标为\(p_1,p_2\)。现在会告诉你两个集合\(S_1=\{|p_1-d_i|,1\leqi\leqn\}\)以及\(S_2=\{|p_2-d_i|,1\leqi\leqn\}\)。这个写法可能不是很规范,但为了美观就写成这样了。......