#include #include using namespace std; using namespace atcoder; typedef modint998244353 mint; typedef long long ll; //defmodfact const int COMinitMAX = 998244; mint fact[COMinitMAX+1], factinv[COMinitMAX+1]; void modfact(){ fact[0] = 1; for (int i=1; i<=COMinitMAX; i++){ fact[i] = fact[i-1] * i; } factinv[COMinitMAX] = fact[COMinitMAX].inv(); for (int i=COMinitMAX-1; i>=0; i--){ factinv[i] = factinv[i+1] * (i+1); } } mint cmb(int a, int b){ if (a> n >> m; vector kettei(n, -1); for (int i=0; i> p >> k; p--; k--; kettei[k] = p; } fenwick_tree f(n); for (int i=0; i= 0){ f.add(kettei[i], -1); } f.add(i, 1); } fenwick_tree g(n); mint fw = 0; mint ans = 0; mint kunum = 0; for (int i=0; i= 0){ ans += fact[n-m] * g.sum(kettei[i], n); ans += fact[n-m-1] * kunum * f.sum(kettei[i], n); fw += f.sum(0, kettei[i]); g.add(kettei[i], 1); }else{ ans += fact[n-m-1] * fw; ans += fact[n-m-2] * mint(n-m) * mint(n-m-1) / 2 * kunum; kunum += 1; } //cout << i << " " << fw.val() << " " << kunum.val() << " " << ans.val() << endl; } cout << ans.val() << endl; }