题意:
在 个数里面挑出 个数, 个数要先递增后递减,然后必须有两个一样的数,剩下的数各不相同。
-
从 个数中挑选 个数进行排列有
-
从 个数中除去峰值那个数选取 个数作为相同的对数有
-
再从 个数中选取 个数放在峰值左边,剩下的放在右边,因为是左边升序右边降序,所以选好数后就是一种,共有
相乘就是答案。
AC代码:
const int N = 200000 + 10;
const int MOD = 998244353;
int n, m;
ll ans, res, tmp;
int F[N], Finv[N], inv[N]; //F是阶乘,Finv是逆元的阶乘
void init()
{
inv[1] = 1;
for (int i = 2; i < N; i++)
{
inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD;
} //递推求逆元
F[0] = Finv[0] = 1;
for (int i = 1; i < N; i++)
{
F[i] = F[i - 1] * 1ll * i % MOD;
Finv[i] = Finv[i - 1] * 1ll * inv[i] % MOD;
}
}
int comb(int n, int m) //comb(n, m)就是C(n, m)
{
if (m < 0 || m > n)
return 0;
return F[n] * 1ll * Finv[n - m] % MOD * Finv[m] % MOD;
}
int main()
{
sdd(n, m);
if (n == 2)
{
puts("0");
return 0;
}
init();
res = comb(m, n - 1) % MOD;
res = res * (n - 2) % MOD;
ans = 0;
rep(i, 0, n - 3)
{
ans = (ans % MOD + comb(n - 3, i) % MOD) % MOD;
}
ans = (ans % MOD * res % MOD) % MOD;
pd(ans);
return 0;
}