最值区间计数(思维)

原题链接:E-最值区间计数_牛客小白月赛63 (nowcoder.com)


计算长度为 n 的所有排列中所有最大值为 n 且最小值为 1 的子区间个数,对 998 244 353取模。

思路:我们用lr来代表我们选的区间的左右边界,先把1和n这两个数拿出来,那么有n-2个数

然后我们再把lr和1,n算成四个位置,那么一共有n+2个位置

先全排列一下,那么就有(n+2)!种情况

那么我们把lr放在四个位置的最左最右,中间的两个位置放1和n,那么就形成了一个满足题意的lr的区间

但是因为这四个位置我们是最后处理的,所以我们要去掉这四个位置全排列的情况:(n+2)!/4!

因为最后的1和n的位置有两种情况,那么最后再*2

最终的柿子是:

(n+2)!/4!*2

特殊处理一下n==1的时候输出1就行了

(ans先*2然后从5开始到n+2的阶乘)

#include
using namespace std;
const int N=1e6+10,mod=998244353;
typedef long long ll;
int n;
int main(){
	cin>>n;
	if(n==1){
		cout<<1<

你可能感兴趣的:(思维,算法,c++,数据结构)