| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 39616 | baka24 | 【S】T3 | C++ | 运行超时 | 30 | 1000 MS | 6036 KB | 1755 | 2026-01-17 13:49:02 |
#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]; 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];} struct treearray{ int C[MAXN]; #define lb(x) ((x)&(-x)) void upd(int x,int y){for(int i=x;i<=n;i+=lb(i))C[i]+=y;} int qry(int x){int res=0;for(int i=x;i>=1;i-=lb(i))res+=C[i];return res;} int qry(int l,int r){return qry(r)-qry(l-1);} }T; void slv(){ans=0; n=read(); for(int i=1;i<=n;i++)a[i]=read(),id[i]=i; sort(id+1,id+n+1,cmp); bool fl=0; for(int i=1;i<=n;i++)if(a[id[i]]!=i)fl=1; if(!fl){ int res=0; for(int i=1;i<=n;i++)res+=T.qry(a[i],n),T.upd(a[i],1); printf("%lld",res%Mod); return; } for(int i=1;i<=n;i++)id[i]=i; int sum=0,num=0; do{ fl=0; for(int i=1;i<=n;i++)fl|=id[i]>a[i]; if(fl)continue; int res=0; for(int i=1;i<=n;i++)res+=T.qry(id[i],n),T.upd(id[i],1); add(sum,res),num++; for(int i=1;i<=n;i++)T.C[i]=0; } while(next_permutation(id+1,id+n+1)); printf("%lld",sum*Pow(num,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; }