首页 > 其他分享 >2024.2.17模拟赛T1题解

2024.2.17模拟赛T1题解

时间:2024-02-17 16:33:05浏览次数:25  
标签:2024.2 排列 17 int 题解 第一段 末尾 mod

先考虑 \(q=(1...n)\) 的情况:
发现如果设 \(divcnt(p)\) 表示将 \(p\) 划分为极小值域连续段的个数,那满足 \(divcnt(p)\ge m\) 的排列都是合法的。
那现在要求出有多少个排列符合条件
可以先算出长度为 \(i\) ,\(divnct\) 为 \(1\) 的排列个数,这可以用dp解决
然后再背包一下,就能求出符合条件的排列数

其他情况:
经过证明,我们必然可以将 \(q\) 拆解为三段(第三段可以没有):
1.(极长)单调递增段
2.断掉之后,又一个单调递增段(不用极长),且满足除第一个数之外,其他数都比第一段末尾大,并且 \(q_{t_1+1}=p_{t_2}\)
3.单点段

由于第一段末尾可求,那我们只需要枚举第二段末尾的位置,这样就能求出第一段需要被划分的段数,用第一种情况求法即可,然后第二段除了第一个数,其他数乱排就好了

code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 505
int n,m,ans,t;
const int mod=998244353;
int a[N],f[N][N],q[N],jc[N];
int cal(int tt){
	int c=m-(n-tt)-1;
	if(c<0) return 0;
	return f[c][t]*jc[tt-t-1]%mod;
}
void mo(int &x){
	if(x>=mod) x-=mod;
}
signed main(){
	//freopen("data.in","r",stdin);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&q[i]);
	jc[0]=1;
	for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;
	for(int i=1;i<=n;i++){
		a[i]=jc[i];
		for(int j=1;j<i;j++) a[i]+=mod-a[j]*jc[i-j]%mod,mo(a[i]);
	}
	for(int i=1;i<=n;i++) f[1][i]=a[i];
	for(int i=2;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<j;k++) f[i][j]+=f[i-1][j-k]*a[k]%mod,mo(f[i][j]);
		}
	}
	for(int i=1;i<=n;i++){
		if(q[i]>q[i-1]) t=i;
		else break;
	}
	if(t==n){
		for(int i=m;i<=n;i++) ans+=f[i][n],mo(ans);
		printf("%lld\n",ans);
		return 0;
	}
	ans=cal(t+1);
	for(int i=t+2;i<=n;i++){
		if(q[i]<q[t]) break;
		if(q[i]<q[i-1]) break;
		ans+=cal(i),mo(ans);
	}
	printf("%lld\n",ans);
	return 0;
}

标签:2024.2,排列,17,int,题解,第一段,末尾,mod
From: https://www.cnblogs.com/hubingshan/p/18018105

相关文章

  • P2042 [NOI2005] 维护数列 题解
    题目链接:维护数列比较不好码的题,首先确保自己会一种文艺平衡树的书写,这点因人而异,比较推荐初学者学\(fhq\)平衡树,坑比较少,比较好码,写平衡树合并、持久化类的题时,也比较好写。注意到空间需求比较大,还涉及删除,我们的删除用各种树类数据结构中最常用的回收标记用于新的节点开辟。......
  • 2024-02-17-物联网C语言(4-预处理)
    4.预处理4.1c语言的编译过程gcc-Ehello.c-ohello.i#1.预编译gcc-Shello.i-ohello.s#2.编译gcc-chello.s-ohello.o#3.汇编gcchello.o-ohello_elf#4.链接预编译将.c中的头文件展开、宏展开编译将预处理之后的.i文件生成.s汇编文件......
  • 2023.2.17 LGJ Round
    A一个字符串,你要选最多的区间出来,满足两两不交,且右边的区间必须是左边区间的严格子串。\(n\le5e5\).注意到答案是\(\sqrtn\)级别的。那么我们设计一个dp,设\(f_{i,j}\)表示\([j,j+i-1]\)这个区间以及右边是否能选出\(i\)个。转移只需要检查大区间减去左端点/右端点......
  • CF1929E 题解
    题意:给定一棵\(n\)个节点数和\(k\)条路径\((a_i,b_i)\),求至少将多少条边染色,使得给定路径都至少有一条染色的边。\(n\le10^5,k\le20\)。思路:好题。显然状压\(dp\),\(dp[S]\)表示至少染多少条边使得\(S\)中的路径都满足条件。正常思路是枚举子集转移,考虑\(T\s......
  • 整数划分 题解
    题目描述如何把一个正整数N(N长度<20)划分为M(M>1)个部分,使这M个部分的乘积最大。N、M从键盘输入,输出最大值及一种划分方式。输入格式第一行一个正整数T(T<=10000),表示有T组数据。接下来T行每行两个正整数N,M。输出格式对于每组数据第一行输出最大值。第二行输出划分方案,将N按......
  • 2024-02-17 有一个观点有松动了,没房没车没存款,配不配
       2024-02-17     好像挺根深蒂固的,没房没车没存款,都没有资格结婚恋爱,在女人面前也很自卑。   直到我叔和婶娘,跟我说,这个不讲配不配得上,而是讲缘分的。举了现实的例子,富家女嫁穷小伙的,帮穷小伙买车买房。   还有一些外省嫁过来的。还有我们家,几个叔......
  • 2024-02-17-物联网C语言(3-函数)
    3.函数3.1函数的概念函数是c语言的功能单位,实现一个功能可以封装一个函数实现。定义一个函数的时候需要一切以功能为目的,根据功能去定义函数的参数和返回值。3.2函数的分类3.2.1从定义角度分类库函数(c库实现)自定义函数(程序员自定义函数)系统调用(操作系统实现的函数)3.......
  • 情书密码 题解
    题目描述有消息称:绝恋找到了自己的MissRight,正准备自己的表白。绝恋已经写好了情书,但为了避免其它人截获,他对情书进行加密。为了打探绝恋的私密,你冒着生命危险终于搞到了这封情书。原以为可以轻易将情书解密,结果竟然发现聪明的绝恋并没有直接写出加密用的密码,而是在那粉红色的......
  • P1217 [USACO1.5] 回文质数 Prime Palindromes
    [USACO1.5]回文质数PrimePalindromes题目描述因为\(151\)既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以\(151\)是回文质数。写一个程序来找出范围\([a,b](5\lea<b\le100,000,000)\)(一亿)间的所有回文质数。输入格式第一行输入两个正整数\(a\)......
  • CF484B题解
    朴素的办法是枚举每两个数然后更新取模的结果。时间复杂度为\(O(n^2)\)不能通过。这个朴素的过程可以看作枚举一个数然后找对其取模最大值的过程。我们可以枚举一个数,然后再枚举以它的倍数为两端的区间,找其中取模的最大值。找最大值的过程可以二分或双指针。值域很小,也可以......