Rt,在Linux虚拟机上能过,不知道为什么交上去全挂
P4769
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 600006
#define P 998244353
using namespace std;
int Pow(int x,int y){
int now=1;
for(;y;y>>=1,x=1LL*x*x%P)if(y&1)now=1LL*now*x%P;
return now;
}
int fac[N],inv[N],n;
int C(int x,int y){
if(x<y)return 0;
return 1LL*fac[x]*inv[y]%P*inv[x-y]%P;
}
int get(int x,int y){
//cout<<"Ask "<<x<<" "<<y<<" "<<C(n-x+n-y,n-x)<<" "<<C(n-x+n-y,n-y-1)<<endl;
return (C(n-x+n-y,n-x)-C(n-x+n-y,n-y-1))%P;
}
int a[N],c[N];
inline void add(int x){for(;x<=n;x+=x&-x)c[x]++;}
inline int ask(int x){int sum=0;for(;x;x-=x&-x)sum+=c[x];return sum;}
void solve(){
memset(c,0,sizeof(c));
scanf("%d",&n);
rep(i,1,n)scanf("%d",&a[i]);
int y=0,ans=0;
rep(i,1,n-1){
if(a[i]<y){
ans=(ans+get(i-1,y+1))%P;
if(ask(a[i])!=a[i]-1)break;
}
else ans=(ans+get(i-1,a[i]+1))%P;
y=max(a[i],y);add(a[i]);
}
printf("%d\n",(ans+P)%P);
}
int main(){
//freopen("inverse3.in","r",stdin);
fac[0]=inv[0]=1;
rep(i,1,N-5)fac[i]=1LL*fac[i-1]*i%P,inv[i]=Pow(fac[i],P-2);
int T;scanf("%d",&T);
while(T--)solve();
return 0;
}