根据条件,某些位置的数字就可以确定了。确定过程中如果有冲突,则无解。
如果B中出现了递增,C中出现了递减,则无解。
对于每一个未确定的a[i],ans需要更新,ans=ans*((c[i]-b[i]+1)-(i-1))%MOD;
如果计算ans过程中,出现了(c[i]-b[i]+1)-(i-1)<=0,则也是无解。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<queue> #include<stack> #include<algorithm> using namespace std; long long MOD=998244353; const int maxn=100000+10; int T,n; int a[maxn],b[maxn],c[maxn]; int tmp1[maxn],tmp2[maxn]; bool f[maxn]; long long h[maxn]; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) scanf("%d",&c[i]); memset(a,-1,sizeof a); memset(tmp1,-1,sizeof tmp1); memset(tmp2,-1,sizeof tmp2); tmp1[1]=b[1]; for(int i=2;i<=n;i++) if(b[i]<b[i-1]) tmp1[i]=b[i]; tmp2[1]=c[1]; for(int i=2;i<=n;i++) if(c[i]>c[i-1]) tmp2[i]=c[i]; bool fail=0; for(int i=1;i<=n;i++) if(tmp1[i]!=-1&&tmp2[i]!=-1&&tmp1[i]!=tmp2[i]) fail=1; for(int i=2;i<=n;i++) if(b[i]>b[i-1]||c[i]<c[i-1]) fail=1; if(fail) { printf("0 "); continue;} for(int i=1;i<=n;i++) { if(tmp1[i]!=-1) a[i]=tmp1[i]; if(tmp2[i]!=-1) a[i]=tmp2[i]; } long long ans=1; for(int i=1;i<=n;i++) { if(a[i]!=-1) continue; if((c[i]-b[i]+1)-(i-1)<=0) ans=0; ans=ans*((c[i]-b[i]+1)-(i-1))%MOD; } printf("%lld ",ans); } return 0; }