#include <bits/stdc++.h>

// #include <atcoder/all>

using namespace std;
// using namespace atcoder;
 
#define DEBUG(x) cerr<<#x<<": "<<x<<endl;
#define DEBUG_VEC(v) cerr<<#v<<":";for(int i=0;i<v.size();i++) cerr<<" "<<v[i]; cerr<<endl;
#define DEBUG_MAT(v) cerr<<#v<<endl;for(int i=0;i<v.size();i++){for(int j=0;j<v[i].size();j++) {cerr<<v[i][j]<<" ";}cerr<<endl;}
typedef long long ll;
// #define int ll
 
#define vi vector<int>
#define vl vector<ll>
#define vii vector< vector<int> >
#define vll vector< vector<ll> >
#define vs vector<string>
#define pii pair<int,int>
#define pis pair<int,string>
#define psi pair<string,int>
#define pll pair<ll,ll>
template<class S, class T> pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first + t.first, s.second + t.second); }
template<class S, class T> pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first - t.first, s.second - t.second); }
template<class S, class T> ostream& operator<<(ostream& os, pair<S, T> p) { os << "(" << p.first << ", " << p.second << ")"; return os; }
#define X first
#define Y second
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define rrep(i,n) for(int i=(int)(n)-1;i>=0;i--)
#define rrep1(i,n) for(int i=(int)(n);i>0;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define in(x, a, b) (a <= x && x < b)
#define all(c) c.begin(),c.end()
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a = b; return 1; } return 0; }
#define UNIQUE(v) v.erase(std::unique(v.begin(), v.end()), v.end());
const ll inf = 1000000001;
const ll INF = (ll)1e18 + 1;
const long double pi = 3.1415926535897932384626433832795028841971L;
#define Sp(p) cout<<setprecision(25)<< fixed<<p<<endl;
// int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
// int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 };
vi dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1};
// vi dx2 = { 1,1,0,-1,-1,-1,0,1 }, dy2 = { 0,1,1,1,0,-1,-1,-1 };
#define fio() cin.tie(0); ios::sync_with_stdio(false);
// const ll MOD = 1000000007;
const ll MOD = 998244353;
// #define mp make_pair
//#define endl '\n'

const int MAXN = 555555;

vl fact(MAXN);
vl rfact(MAXN);

ll mod_pow(ll x, ll p, ll M = MOD) {
  if (p < 0) {
    x = mod_pow(x, M - 2, M);
    p = -p;
  }
  ll a = 1;
  while (p) {
    if (p % 2)
      a = a*x%M;
    x = x*x%M;
    p /= 2;
  }
  return a;
}

ll mod_inverse(ll a, ll M = MOD) {
  return mod_pow(a, M - 2, M);
}

void set_fact(ll n, ll M = MOD) {
  fact[0] = 1;
  for (ll i = 1; i <= n; i++) {
    fact[i] = i * fact[i - 1] % M;
  }
  rfact[n] = mod_inverse(fact[n], M);
  for (ll i = n - 1; i >= 0; i--) {
      rfact[i] = (i + 1) * rfact[i + 1] % M;
  }
}

//http://drken1215.hatenablog.com/entry/2018/06/08/210000
//n���傫��fact���v�Z�ł��Ȃ��Ƃ��̂ق��̌v�Z���@�ɂ��ď����Ă���
ll nCr(ll n, ll r, ll M = MOD) {
  if (r > n) return 0;
  assert(fact[2] == 2);
  ll ret = fact[n];
  if (rfact[r] == 0) {
    rfact[r] = mod_inverse(fact[r], M);
  }
  ret = (ret*rfact[r]) % M;
  if (rfact[n - r] == 0) {
    rfact[n - r] = mod_inverse(fact[n - r], M);
  }
  ret = (ret*rfact[n - r]) % M;
  return ret;
}

ll nHr(ll n, ll r) {
  return nCr(n+r-1, r);
}


template <typename T>
class SegmentTree {
public:
  using F = function<T(T&, T&)>;
  int n;
  vector<T > dat;
  T e; // �P�ʌ�
  F query_func;
  F update_func;
  
  SegmentTree(vector<T> a, F query_func, F update_func, T e) :n(a.size()), query_func(query_func), update_func(update_func), e(e) {
    if (n == 0) {
      a.push_back(e);
      n++;
    }
    dat.resize(4 * n);
    init(0, 0, n, a);
  }

  void init(int k, int l, int r, vector<T> &a) {
    if (r - l == 1) {
      dat[k] = a[l];
    }
    else {
      int lch = 2 * k + 1, rch = 2 * k + 2;
      init(lch, l, (l + r) / 2, a);
      init(rch, (l + r) / 2, r, a);
      dat[k] = query_func(dat[lch], dat[rch]);
    }
  }

  //k�Ԗڂ̒l��a�ɕύX
  void update(int k, T a, int v, int l, int r) {
    if (r - l == 1) {
      dat[v] = update_func(dat[v], a);
    }
    else {
      if (k < (l + r) / 2)
        update(k, a, 2 * v + 1, l, (l + r) / 2);
      else {
        update(k, a, 2 * v + 2, (l + r) / 2, r);
      }
      dat[v] = query_func(dat[v * 2 + 1], dat[v * 2 + 2]);
    }
  }
    

  //[a,b)�̍ŏ��l�����߂�
  //���̂ق��̈����͌v�Z�̊ȒP�̂��߂̈���
  //k�͐ړ_�̔ԍ�,l,r�͂��̐ړ_��[l,r)�ɑΉ����Ă��邱�Ƃ�\��
  //�]���āA�O�����query(a,b,0,0,n)�Ƃ��Ă��
  T query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) {
      return e;
    }
    if (a <= l && r <= b) {
      return dat[k];
    }
    else {
      T ul = query(a, b, k * 2 + 1, l, (l + r) / 2);
      T ur = query(a, b, k * 2 + 2, (l + r) / 2, r);
      return query_func(ul, ur);
    }
  }

  // �����𖞂����ĉE��T��
  int find(int a, int b, int k, int l, int r, int x) {
    // �����𒼂�
    if (dat[k] < x || r <= a || b <= l) return -1;
    if (l + 1 == r) {
      // �����𒼂�
      if (dat[k] >= x) return l;
      else return -1;
    }
    int rv = find(a, b, 2 * k + 2, (l + r) / 2, r, x);
    if (rv != -1) return rv;
    return find(a, b, 2 * k + 1, l, (l + r) / 2, x);
  }
};

ll f(ll a, ll b) {return (a + b) % MOD;}
ll g(ll a, ll b) {return b;}


signed main() {
    fio();
    int n, k;
    cin >> n >> k;

    ll L = (k - 1) * mod_inverse(k) % MOD;

    vi p(n);
    rep (i, n) cin >> p[i];
    ll inv2 = mod_inverse(2);
    ll invL = mod_inverse(L);
    // DEBUG(invL);

    vl temp(n), temp2(n);
    // SegmentTree<ll> low(temp, f, g, 0);
    vi kata(n);
    rep (i, n) {
        if (i < k) {
            kata[i] = 0;
            temp[i] = 1;
            temp2[i] = 1;
        }
        else {
            kata[i] = i - k + 1;
            temp[i] = mod_pow(L, i - k + 1);
            temp2[i] = mod_pow(invL, i - k + 1);
        }
    }
    SegmentTree<ll> high(temp, f, g, 0);
    SegmentTree<ll> high2(temp2, f, g, 0);
    temp = vl(n, 1);
    SegmentTree<ll> num(temp, f, g, 0);
    // DEBUG_VEC(temp2);
    // rep (i, n) {
    //     cout << high2.query(i, i + 1, 0, 0, high2.n) << " ";
    // }
    // cout << endl;

    vector<pii> pi(n);
    rep (i, n) pi[i] = pii(p[i], i);
    sort(all(pi));

    // DEBUG_VEC(pi);
    ll ans = 0;
    rep (i, n) {
        int idx = pi[i].second;
        ll s = high.query(idx + 1, n, 0, 0, high.n);
        // DEBUG(s);        
        s = s * inv2 % MOD * mod_pow(invL, kata[idx]) % MOD;
        // DEBUG(s);
        ans += s;
        ans %= MOD;

        s = high2.query(0, idx, 0, 0, high.n);
        // DEBUG(s);
        s = s * inv2 % MOD * mod_pow(L, kata[idx]) % MOD;
        // DEBUG(s);
        ll nu = num.query(0, idx, 0, 0, num.n);
        // DEBUG(nu);
        ans += nu - s;
        ans %= MOD;

        high.update(idx, 0, 0, 0, high.n);
        high2.update(idx, 0, 0, 0, high2.n);
        num.update(idx, 0, 0, 0, num.n);
    }
    ans = (ans % MOD + MOD) % MOD;
    cout << ans << endl;
}
### Prompt

Construct a CPP code solution to the problem outlined:

Given are a permutation p_1, p_2, \dots, p_N of (1, 2, ..., N) and an integer K. Maroon performs the following operation for i = 1, 2, \dots, N - K + 1 in this order:

* Shuffle p_i, p_{i + 1}, \dots, p_{i + K - 1} uniformly randomly.



Find the expected value of the inversion number of the sequence after all the operations are performed, and print it modulo 998244353.

More specifically, from the constraints of this problem, it can be proved that the expected value is always a rational number, which can be represented as an irreducible fraction \frac{P}{Q}, and that the integer R that satisfies R \times Q \equiv P \pmod{998244353}, 0 \leq R < 998244353 is uniquely determined. Print this R.

Here, the inversion number of a sequence a_1, a_2, \dots, a_N is defined to be the number of ordered pairs (i, j) that satisfy i < j, a_i > a_j.

Constraints

* 2 \leq N \leq 200,000
* 2 \leq K \leq N
* (p_1, p_2, \dots, p_N) is a permutation of (1, 2, \dots, N).
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N K
p_1 p_2 ... p_N


Output

Print the expected value modulo 998244353.

Examples

Input

3 2
1 2 3


Output

1


Input

10 3
1 8 4 9 2 3 7 10 5 6


Output

164091855

### Response

```cpp
#include <bits/stdc++.h>

// #include <atcoder/all>

using namespace std;
// using namespace atcoder;
 
#define DEBUG(x) cerr<<#x<<": "<<x<<endl;
#define DEBUG_VEC(v) cerr<<#v<<":";for(int i=0;i<v.size();i++) cerr<<" "<<v[i]; cerr<<endl;
#define DEBUG_MAT(v) cerr<<#v<<endl;for(int i=0;i<v.size();i++){for(int j=0;j<v[i].size();j++) {cerr<<v[i][j]<<" ";}cerr<<endl;}
typedef long long ll;
// #define int ll
 
#define vi vector<int>
#define vl vector<ll>
#define vii vector< vector<int> >
#define vll vector< vector<ll> >
#define vs vector<string>
#define pii pair<int,int>
#define pis pair<int,string>
#define psi pair<string,int>
#define pll pair<ll,ll>
template<class S, class T> pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first + t.first, s.second + t.second); }
template<class S, class T> pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first - t.first, s.second - t.second); }
template<class S, class T> ostream& operator<<(ostream& os, pair<S, T> p) { os << "(" << p.first << ", " << p.second << ")"; return os; }
#define X first
#define Y second
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define rrep(i,n) for(int i=(int)(n)-1;i>=0;i--)
#define rrep1(i,n) for(int i=(int)(n);i>0;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define in(x, a, b) (a <= x && x < b)
#define all(c) c.begin(),c.end()
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a = b; return 1; } return 0; }
#define UNIQUE(v) v.erase(std::unique(v.begin(), v.end()), v.end());
const ll inf = 1000000001;
const ll INF = (ll)1e18 + 1;
const long double pi = 3.1415926535897932384626433832795028841971L;
#define Sp(p) cout<<setprecision(25)<< fixed<<p<<endl;
// int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
// int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 };
vi dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1};
// vi dx2 = { 1,1,0,-1,-1,-1,0,1 }, dy2 = { 0,1,1,1,0,-1,-1,-1 };
#define fio() cin.tie(0); ios::sync_with_stdio(false);
// const ll MOD = 1000000007;
const ll MOD = 998244353;
// #define mp make_pair
//#define endl '\n'

const int MAXN = 555555;

vl fact(MAXN);
vl rfact(MAXN);

ll mod_pow(ll x, ll p, ll M = MOD) {
  if (p < 0) {
    x = mod_pow(x, M - 2, M);
    p = -p;
  }
  ll a = 1;
  while (p) {
    if (p % 2)
      a = a*x%M;
    x = x*x%M;
    p /= 2;
  }
  return a;
}

ll mod_inverse(ll a, ll M = MOD) {
  return mod_pow(a, M - 2, M);
}

void set_fact(ll n, ll M = MOD) {
  fact[0] = 1;
  for (ll i = 1; i <= n; i++) {
    fact[i] = i * fact[i - 1] % M;
  }
  rfact[n] = mod_inverse(fact[n], M);
  for (ll i = n - 1; i >= 0; i--) {
      rfact[i] = (i + 1) * rfact[i + 1] % M;
  }
}

//http://drken1215.hatenablog.com/entry/2018/06/08/210000
//n���傫��fact���v�Z�ł��Ȃ��Ƃ��̂ق��̌v�Z���@�ɂ��ď����Ă���
ll nCr(ll n, ll r, ll M = MOD) {
  if (r > n) return 0;
  assert(fact[2] == 2);
  ll ret = fact[n];
  if (rfact[r] == 0) {
    rfact[r] = mod_inverse(fact[r], M);
  }
  ret = (ret*rfact[r]) % M;
  if (rfact[n - r] == 0) {
    rfact[n - r] = mod_inverse(fact[n - r], M);
  }
  ret = (ret*rfact[n - r]) % M;
  return ret;
}

ll nHr(ll n, ll r) {
  return nCr(n+r-1, r);
}


template <typename T>
class SegmentTree {
public:
  using F = function<T(T&, T&)>;
  int n;
  vector<T > dat;
  T e; // �P�ʌ�
  F query_func;
  F update_func;
  
  SegmentTree(vector<T> a, F query_func, F update_func, T e) :n(a.size()), query_func(query_func), update_func(update_func), e(e) {
    if (n == 0) {
      a.push_back(e);
      n++;
    }
    dat.resize(4 * n);
    init(0, 0, n, a);
  }

  void init(int k, int l, int r, vector<T> &a) {
    if (r - l == 1) {
      dat[k] = a[l];
    }
    else {
      int lch = 2 * k + 1, rch = 2 * k + 2;
      init(lch, l, (l + r) / 2, a);
      init(rch, (l + r) / 2, r, a);
      dat[k] = query_func(dat[lch], dat[rch]);
    }
  }

  //k�Ԗڂ̒l��a�ɕύX
  void update(int k, T a, int v, int l, int r) {
    if (r - l == 1) {
      dat[v] = update_func(dat[v], a);
    }
    else {
      if (k < (l + r) / 2)
        update(k, a, 2 * v + 1, l, (l + r) / 2);
      else {
        update(k, a, 2 * v + 2, (l + r) / 2, r);
      }
      dat[v] = query_func(dat[v * 2 + 1], dat[v * 2 + 2]);
    }
  }
    

  //[a,b)�̍ŏ��l�����߂�
  //���̂ق��̈����͌v�Z�̊ȒP�̂��߂̈���
  //k�͐ړ_�̔ԍ�,l,r�͂��̐ړ_��[l,r)�ɑΉ����Ă��邱�Ƃ�\��
  //�]���āA�O�����query(a,b,0,0,n)�Ƃ��Ă��
  T query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) {
      return e;
    }
    if (a <= l && r <= b) {
      return dat[k];
    }
    else {
      T ul = query(a, b, k * 2 + 1, l, (l + r) / 2);
      T ur = query(a, b, k * 2 + 2, (l + r) / 2, r);
      return query_func(ul, ur);
    }
  }

  // �����𖞂����ĉE��T��
  int find(int a, int b, int k, int l, int r, int x) {
    // �����𒼂�
    if (dat[k] < x || r <= a || b <= l) return -1;
    if (l + 1 == r) {
      // �����𒼂�
      if (dat[k] >= x) return l;
      else return -1;
    }
    int rv = find(a, b, 2 * k + 2, (l + r) / 2, r, x);
    if (rv != -1) return rv;
    return find(a, b, 2 * k + 1, l, (l + r) / 2, x);
  }
};

ll f(ll a, ll b) {return (a + b) % MOD;}
ll g(ll a, ll b) {return b;}


signed main() {
    fio();
    int n, k;
    cin >> n >> k;

    ll L = (k - 1) * mod_inverse(k) % MOD;

    vi p(n);
    rep (i, n) cin >> p[i];
    ll inv2 = mod_inverse(2);
    ll invL = mod_inverse(L);
    // DEBUG(invL);

    vl temp(n), temp2(n);
    // SegmentTree<ll> low(temp, f, g, 0);
    vi kata(n);
    rep (i, n) {
        if (i < k) {
            kata[i] = 0;
            temp[i] = 1;
            temp2[i] = 1;
        }
        else {
            kata[i] = i - k + 1;
            temp[i] = mod_pow(L, i - k + 1);
            temp2[i] = mod_pow(invL, i - k + 1);
        }
    }
    SegmentTree<ll> high(temp, f, g, 0);
    SegmentTree<ll> high2(temp2, f, g, 0);
    temp = vl(n, 1);
    SegmentTree<ll> num(temp, f, g, 0);
    // DEBUG_VEC(temp2);
    // rep (i, n) {
    //     cout << high2.query(i, i + 1, 0, 0, high2.n) << " ";
    // }
    // cout << endl;

    vector<pii> pi(n);
    rep (i, n) pi[i] = pii(p[i], i);
    sort(all(pi));

    // DEBUG_VEC(pi);
    ll ans = 0;
    rep (i, n) {
        int idx = pi[i].second;
        ll s = high.query(idx + 1, n, 0, 0, high.n);
        // DEBUG(s);        
        s = s * inv2 % MOD * mod_pow(invL, kata[idx]) % MOD;
        // DEBUG(s);
        ans += s;
        ans %= MOD;

        s = high2.query(0, idx, 0, 0, high.n);
        // DEBUG(s);
        s = s * inv2 % MOD * mod_pow(L, kata[idx]) % MOD;
        // DEBUG(s);
        ll nu = num.query(0, idx, 0, 0, num.n);
        // DEBUG(nu);
        ans += nu - s;
        ans %= MOD;

        high.update(idx, 0, 0, 0, high.n);
        high2.update(idx, 0, 0, 0, high2.n);
        num.update(idx, 0, 0, 0, num.n);
    }
    ans = (ans % MOD + MOD) % MOD;
    cout << ans << endl;
}
```