結果
問題 | No.2327 Inversion Sum |
ユーザー |
|
提出日時 | 2023-05-28 14:09:36 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 124 ms / 2,000 ms |
コード長 | 3,111 bytes |
コンパイル時間 | 10,352 ms |
コンパイル使用メモリ | 284,072 KB |
最終ジャッジ日時 | 2025-02-13 10:58:06 |
ジャッジサーバーID (参考情報) |
judge4 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
#pragma GCC target("avx2")#pragma GCC optimize("Ofast")#pragma GCC optimize("unroll-loops")#include<bits/stdc++.h>using namespace std;using ll = long long int;using ull = unsigned long long int;using ld = long double;ll MOD = 998244353;ll modpow(ll A,ll B,ll M){ll r = 1,p = A;while(B > 0){if(B % 2 == 1) r = (r * p) % M;p = (p * p) % M;B /= 2;}return r;}vector<ll> fac,finv,inv;void COMinit(ll n = 1000000){fac.resize(n);finv.resize(n);inv.resize(n);inv[1] = 1;fac[0] = fac[1] = 1;finv[0] = finv[1] = 1;ll i;for(i = 2;i < n;i++){fac[i] = (fac[i - 1] * i) % MOD;inv[i] = MOD - ((inv[MOD % i] * (MOD / i)) % MOD);finv[i] = (finv[i - 1] * inv[i]) % MOD;}}ll COM(ll n,ll m){//nCmif(n < m) return 0;if(n < 0 || m < 0) return 0;return (fac[n] * (finv[m] * finv[n - m] % MOD)) % MOD;}ll f(ll a,ll b){return COM(a + b,a);}struct BIT{ll n;vector<ll> A;BIT(ll N):A(N + 1,0){ n = N; }void add(ll i,ll x){i++;for(;i <= n;i += i & -i) A[i] += x;}ll query(ll x){x++;ll r = 0;for(;x > 0;x -= x & -x) r += A[x];return r;}ll query(ll l,ll r){return query(r - 1) - query(l - 1);}};int main(){COMinit();ios::sync_with_stdio(false);cin.tie(nullptr);ll N,M;cin >> N >> M;ll L = N - M;ll kari = ((L) * (L - 1)) % MOD;kari *= inv[4];kari %= MOD;kari *= fac[L];kari %= MOD;vector<ll> A(N,1),B(N),C(N,1),D(N),g;vector<tuple<ll,ll>> F;for(ll i = 0;i < M;i++){ll p,k;cin >> p >> k;p--;k--;A[k] = 0;D[k] = p;C[p] = 0;}B[N - 1] = 0;for(ll i = N - 2;i >= 0;i--){B[i] = B[i + 1] + A[i + 1];}for(ll i = 0;i < N;i++){if(C[i] == 1) g.emplace_back(i);}for(ll i = 0;i < N;i++){if(A[i] == 0){// calc{ll ans = lower_bound(g.begin(),g.end(),D[i]) - g.begin();ans *= inv[(ll)g.size()];ans %= MOD;ans *= B[i];ans %= MOD;ans *= fac[L];ans %= MOD;kari += ans;}{ll ans = (ll)g.size() - (lower_bound(g.begin(),g.end(),D[i]) - g.begin());ans *= inv[(ll)g.size()];ans %= MOD;ans *= (L - B[i]);ans %= MOD;ans *= fac[L];ans %= MOD;kari += ans;}}}vector<ll> T;for(ll i = 0;i < N;i++){if(A[i] == 0) T.emplace_back(D[i]);}ll kari2 = 0;BIT tree(200000);for(ll i = 0;i < (ll)T.size();i++){ll p = T[i];ll k = tree.query(p + 1,200000);kari2 += k;kari2 %= MOD;tree.add(p,1);}kari2 *= fac[L];kari2 %= MOD;cout << (kari + kari2) % MOD << endl;}