1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5; const int p=998244353; int tr[3][4*N]; void pushup(int p,int* tr) { tr[p]=tr[p*2]+tr[p*2+1]; } void update(int x,int k,int l,int r,int p,int* tr) { if(l==r) { tr[p]+=k; return; } int m=(l+r)>>1; if(x<=m) update(x,k,l,m,p*2,tr); else update(x,k,m+1,r,p*2+1,tr); pushup(p,tr); } int query(int ql,int qr,int l,int r,int p,int *tr) { if(ql<=l&&qr>=r) return tr[p]; int m=(l+r)>>1; int ans=0; if(ql<=m) ans+=query(ql,qr,l,m,p*2,tr); if(qr>m) ans+=query(ql,qr,m+1,r,p*2+1,tr); return ans; } int a[N]; ll fac[N],ifac[N]; ll fpow(ll a,ll b) { ll res=1; while(b) { if(b&1) res=res*a%p; a=a*a%p; b>>=1; } return res; } const int inv2=fpow(2,p-2); void init() { fac[0]=1; for(int i=1;i<N;i++) fac[i]=i*fac[i-1]%p; ifac[N-1]=fpow(fac[N-1],p-2); for(int i=N-1;i;i--) ifac[i-1]=i*ifac[i]%p; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); init(); int n,k;cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=k;i++) update(a[i],1,1,n,1,tr[1]); ll cur=0; for(int i=k+1;i<=n;i++) { cur=(cur+query(a[i],n,1,n,1,tr[2]))%p; update(a[i],1,1,n,1,tr[2]); } for(int i=1;i<=k;i++) cur=(cur+query(1,a[i],1,n,1,tr[2]))%p; cur=(cur+1ll*k*(k-1)/2%p*inv2)%p; ll ans=cur*fac[k]%p; for(int i=1;i<n-k+1;i++) { cur=(cur-query(a[i+k],n,1,n,1,tr[0])+p)%p; cur=(cur+query(a[i],n,1,n,1,tr[0]))%p; cur=(cur-query(a[i],n,1,n,1,tr[0])+p)%p; cur=(cur-query(1,a[i],1,n,1,tr[2])+p)%p; cur=(cur-query(a[i+k],n,1,n,1,tr[1])+p)%p; update(a[i],1,1,n,1,tr[0]),update(a[i],-1,1,n,1,tr[1]); update(a[i+k],1,1,n,1,tr[1]),update(a[i+k],-1,1,n,1,tr[2]); cur=(cur-query(1,a[i+k],1,n,1,tr[2])+p)%p; cur=(cur+query(1,a[i],1,n,1,tr[2]))%p; cur=(cur+query(1,a[i],1,n,1,tr[1]))%p; cur=(cur+query(a[i+k],n,1,n,1,tr[0]))%p; cur=(cur+query(1,a[i+k],1,n,1,tr[2]))%p; ans=(ans+cur*fac[k])%p; } ans=ans*fpow(n-k+1,p-2)%p*ifac[k]%p; cout<<ans<<'\n'; return 0; }
|