提交时间:2026-01-17 15:16:35
运行 ID: 39630
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define pb push_back #define mk make_pair const int MAXN=200050,N=1010,Mod=998244353; void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;} int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} int n,m,k,ans,sum,a[MAXN],id[MAXN],p[MAXN]; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} bool cmp(int x,int y){return a[x]!=a[y]?a[x]<a[y]:x>y;} struct treearray{ int C[MAXN]; #define lb(x) ((x)&(-x)) void cln(){for(int i=1;i<=n;i++)C[i]=0;} void upd(int x,int y){for(int i=x;i<=n;i+=lb(i))add(C[i],y);} int qry(int x){int res=0;for(int i=x;i>=1;i-=lb(i))add(res,C[i]);return res;} int qry(int l,int r){return (qry(r)-qry(l-1)+Mod)%Mod;} }T,A; int s[MAXN],s1[MAXN],sp[MAXN]; void slv(){ans=0; n=read(); for(int i=1;i<=n;i++)a[i]=min(n,read()),id[i]=i; sort(id+1,id+n+1,cmp); for(int i=1;i<=n;i++)if(a[id[i]]<i){puts("0");return;} s[0]=s1[0]=1; for(int i=1;i<=n;i++)s[i]=s[i-1]*(a[id[i]]-i+1)%Mod, s1[i]=max(1ll,s1[i-1]*(a[id[i]]-i)%Mod),sp[i]=sp[i-1]+(a[id[i]]==i); for(int i=1;i<=n;i++)p[id[i]]=i; int inv=Pow(2,Mod-2); for(int i=1;i<=n;i++)add(ans,s[n]*T.qry(a[i]+1,n)%Mod),add(ans,s[n]*inv%Mod*T.qry(a[i],a[i])%Mod),T.upd(a[i],1); vector<int>TMP,TMP2; for(int x=1;x<=n;x++){ add(ans,Mod-inv*Pow(s[x],Mod-2)%Mod*s1[x-1]%Mod*A.qry(id[x]+1,n)%Mod); add(ans,inv*Pow(s[x],Mod-2)%Mod*s1[x-1]%Mod*A.qry(1,id[x]-1)%Mod); if(a[id[x+1]]!=a[id[x]])for(int i=x;a[id[x]]==a[id[i]];i--)A.upd(id[i],s[i-1]*(a[id[i]]-i+1)%Mod*s[n]%Mod*Pow(s1[i-1],Mod-2)%Mod),TMP.pb(id[i]); if(a[id[x]]<=x){ for(auto o:TMP)A.upd(o,Mod-s[o-1]*(a[id[o]]-o+1)%Mod*s[n]%Mod*Pow(s1[o-1],Mod-2)%Mod);TMP.clear(); } } printf("%lld",ans*Pow(s[n],Mod-2)%Mod); } signed main(){ // freopen("task.in","r",stdin);freopen("task.out","w",stdout); slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }