康托展开

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=1000005;
const int mod=998244353;
int n;
ll ans;
int a[N],t[N],b[N];
ll jc[N];
int lowbit(int x){
	return x&(-x);
}
void add(int x,int y){
	while(x<=n){
		t[x]+=y;
		x+=lowbit(x);
	}
}
int ask(int x){
	int res=0;
	while(x){
		res+=t[x];
		x-=lowbit(x);
	}
	return res;
}
int main(){
	scanf("%d",&n);
	jc[1]=1;
	for(int i=2;i<=n;i++) jc[i]=(jc[i-1]*i)%mod;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		add(a[i],1);	
	}
	for(int i=1;i<=n;i++){
		add(a[i],-1);
		b[n-i+1]=ask(a[i]);
	}
	for(int i=1;i<=n;i++) ans=(ans+(ll)b[i]*jc[i-1]%mod)%mod;
	printf("%lld",ans+1);
	return 0;
}
posted @ 2022-02-23 11:18  dfydn  阅读(23)  评论(0编辑  收藏  举报