题意
给你一个包含个元素的数组,这个数组里面的数字都在
这个区间里面,问你有多少种数组满足下面的条件
- 有一个
,保证
- 这个数组恰好存在一对相等的数字
思路
因为恰好存在一对相等的数字,我们设为,不然发现两个
一定分别位于
的两侧。
我们可以枚举这个数字(也就是最大值),然后对于除了
的这个其它数字,他们都可以位于左侧,或者右侧
代码
/**
* author: andif
* created: 24.08.2023 23:37:00
**/
#include<bits/stdc++.h>
using namespace std;
#define de(x) cerr << #x << " = " << x << endl
#define dd(x) cerr << #x << " = " << x << " "
#define rep(i, a, b) for(int i = a; i < b; ++i)
#define per(i, a, b) for(int i = a; i > b; --i)
#define mt(a, b) memset(a, b, sizeof(a))
#define sz(a) (int)a.size()
#define fi first
#define se second
#define qc ios_base::sync_with_stdio(0);cin.tie(0)
#define eb emplace_back
#define all(a) a.begin(), a.end()
using ll = long long;
using db = double;
using pii = pair<int, int>;
using pdd = pair<db, db>;
using pll = pair<ll, ll>;
using vi = vector<int>;
const db eps = 1e-9;
const int mod = 998244353;
const int N = 2e5 + 6;
int f[N], inv[N];
int qpow(int a, int b) {
int ret = 1;
while(b) {
if (b & 1) {
ret = 1ll * ret * a % mod;
}
a = 1ll * a * a % mod;
b >>= 1;
}
return ret;
}
void init() {
f[0] = 1;
rep(i, 1, N) f[i] = 1ll * i * f[i - 1] % mod;
inv[N - 1] = qpow(f[N - 1], mod - 2);
per(i, N - 2, -1) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
}
int C(int n, int m) {
// dd(n), de(m);
// if (n == m) return 1;
return 1ll * f[n] * inv[n - m] % mod * inv[m] % mod;
}
int main() {
init();
int n, m; cin >> n >> m;
if (n == 2) {
// cout << 1ll * m * (m - 1) / 2 % mod << '\n';
cout << "0" << '\n';
} else {
int ans = 0;
rep(i, n - 1, m + 1) {
int a = n - 3;
if (i - 2 == 0) {
ans = (ans + 1ll * (i - 1) * qpow(2, a) % mod) % mod;
} else {
ans = (ans + 1ll * (i - 1) * C(i - 2, n - 3) % mod * qpow(2, a) % mod) % mod;
}
// de(ans);
}
cout << ans << '\n';
}
return 0;
}