求构造数列数量
数列满足条件
1.n个元素
2.元素范围(1-m)
3.仅存在一对索引,元素相同
4.仅存在一个峰 (ai<ai+1>ai+2)
一. 应该是m中选n-1个 即
二.存在一个峰,所以选择元素值应该是排除最大的那个
三.选择的元素位置可以在左边也可以在右边,我们确定了最大的在中间,相同的在左右两边,因此有n-3个元素是不确定的,
根据乘法原理
数量为
// Problem: D. Count the Arrays
// Contest: Codeforces - Educational Codeforces Round 83 (Rated for Div. 2)
// URL: https://codeforces.com/problemset/problem/1312/D
// Memory Limit: 512 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int N=2e5+9;
ll f[N],invf[N];
ll qmi(ll a,ll b){
ll res=1;
while(b){
if(b&1){
res=res*a%mod;
}
b>>=1;
a=a*a%mod;
}
return res;
}
ll inv(ll x){
return qmi(x,mod-2)%mod;
}
ll C(ll n,ll m){
return ((f[n]*invf[m]%mod)*invf[n-m])%mod;
}
void init(){
f[0]=1;
for(int i=1;i<=200002;i++){
f[i]=f[i-1]*i%mod;
}
invf[200001]=inv(f[200001]);
for(int i=200000;i>=1;i--){
invf[i]=invf[i+1]*(i+1)%mod;
}
}
// C(m,n-1)*(n-2)*qmi(2,n-3);
int main(){
init();
int n,m;
cin>>n>>m;
if(n==2){
cout<<0<<'\n';
return 0;
}
ll t1=C(m,n-1);
ll t2=n-2;
ll t3=qmi(2,n-3);
ll ans=1;
ans*=t1;
ans*=t2;
ans%=mod;
ans*=t3;
cout<<ans%mod<<'\n';
return 0;
}
3496

被折叠的 条评论
为什么被折叠?



