题意

给你一个包含个元素的数组,这个数组里面的数字都在这个区间里面,问你有多少种数组满足下面的条件

  • 有一个,保证
  • 这个数组恰好存在一对相等的数字

思路

因为恰好存在一对相等的数字,我们设为,不然发现两个一定分别位于的两侧。

我们可以枚举这个数字(也就是最大值),然后对于除了的这个其它数字,他们都可以位于左侧,或者右侧

代码

/**
 *    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;
}