刚学OI,很短的代码,求找UB
  • 板块学术版
  • 楼主7KByte
  • 当前回复7
  • 已保存回复7
  • 发布时间2021/4/2 10:12
  • 上次更新2023/11/5 01:10:55
查看原帖
刚学OI,很短的代码,求找UB
119261
7KByte楼主2021/4/2 10:12

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;
}
2021/4/2 10:12
加载中...