康托展开板子喜提十分,求调)
查看原帖
康托展开板子喜提十分,求调)
214728
剑雪清寒楼主2022/9/1 10:02

是哪寄了捏

#include <bits/stdc++.h>
using namespace std;
const long long p=998244353;
inline long long read() {
	long long x;bool f;char ch;
	for(f=0;!isdigit(ch=getchar());f=ch=='-');
	for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
	return f?-x:x;
}
inline void print(long long x,char las) {
	if(!x) {
		putchar(48),putchar(las);
		return ;
	}
	if(x<0) putchar('-'),x=-x;
	int ls[20],k=0;
	while(x) ls[++k]=x%10,x/=10;
	while(k) putchar(ls[k--]+48);
	putchar(las);
	return ; 
}
long long xz=1;
inline long long inv(long long x) {
	int b=p-2;long long res=1;
	while(b) {
		if(b&1) res*=x,res%=p;
		x*=x;x%=p;
		b>>=1;
	}
	return res;
}
int n=read();
inline long long ktzk(int *k) {
	long long ls[xz+1]={},jc=1,res=0;
	for(int i=1;i<=n;i++) {
		jc*=i;jc%=p;
		int now=i;
		while(now<=xz) ls[now]++,now+=now&-now;
	}
//	for(int i=1;i<=xz;i++) print(ls[i],'\n');
	for(int i=1;i<n;i++) {
		jc*=inv(n-i+1);jc%=p;
		long long now=k[i]-1,p=0;
		while(now) p+=ls[now],now-=now&-now;
//		cout<<p<<' '<<jc<<'\n';
		res+=jc*p;
		now=k[i];
		while(now<=xz) ls[now]--,now+=now&-now;
	}
	return res;
}
int a[1000001];
int main() {
//	cout<<6*inv(3)%p;
	for(int i=1;i<=n;i++) a[i]=read();
	while(xz<n) xz<<=1;
//	cout<<xz<<'\n';
	print(ktzk(a)+1,'\n');
	return 0;
}

2022/9/1 10:02
加载中...