提交时间:2024-09-08 15:12:54

运行 ID: 32326

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e6+10,mod=998244353; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,jc[maxn],jc_inv[maxn],f[maxn],g[maxn],t[maxn]; int vis[maxn];int T[maxn]; int qpow(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod,b>>=1; }return res; } int A(int n,int m){if(m<n)return 0;return jc[m]*1ll*jc_inv[m-n]%mod;} int C(int n,int m){if(m<n)return 0;return jc[m]*1ll*jc_inv[m-n]%mod*1ll*jc_inv[n]%mod;} int S[2005][2005]; void slv(){ n=read();jc[0]=jc_inv[0]=1;up(i,1,n+1)jc[i]=jc[i-1]*1ll*i%mod,jc_inv[i]=qpow(jc[i],mod-2); int m=read();up(i,1,m)T[i]=read();sort(T+1,T+m+1); up(i,1,n)vis[i]=0;up(i,1,m)vis[T[i]]=1; up(i,0,n){ f[n-i]=0; //up(k,1,n)(f[i]+=A(k-1,i)*1ll*jc[n-k+1]%mod)%=mod; ll g=C(i,n+1)-(i==n); g=g*1ll*jc[i]%mod*1ll*jc[n-i]%mod; f[n-i]=g; }up(i,0,n)g[i]=f[i];g[n+1]=g[n+2]=0; up(i,1,n)f[i]=(f[i]+f[i-1])%mod;f[n+1]=f[n+2]=f[n]; int res=0; up(i,1,n){ if(vis[i])continue; int p=lower_bound(T+1,T+m+1,i)-T; if(p!=m+1){ int len=T[p]-i+1; (res+=(f[len]-f[1]+mod)%mod)%=mod; (res+=g[len+1]%mod*1ll*(m-p)%mod)%=mod; }else { int len=n-i+1; (res+=(f[len]-f[1]+mod)%mod)%=mod; }p--; if(p){ int len=i-T[p]+1; (res+=g[len])%=mod; (res+=g[len+1]*1ll*(p-1)%mod)%=mod; }//cout<<"? "<<res<<endl; }(res+=m*1ll*(m-1)/2%mod*1ll*g[2]%mod)%=mod; //cout<<"? "<<res<<endl; vector<int>A; up(i,1,m){ if(i==1)A.p_b(T[i]-1); else A.p_b(T[i]-T[i-1]-1); }A.p_b(n-T[m]); //for(int x:A)cout<<"? "<<x<<endl; auto B=A;sort(B.begin(),B.end());B.erase(unique(B.begin(),B.end()),B.end()); if(B.size()&&(!B[0]))B.erase(B.begin()); int sz=B.size(); up(i,1,int(A.size())-1){ int x=A[i],y=A[i-1]; if((!x)||(!y))continue; up(k,1,x+y){ int l=max(k-y,1),r=min(k-1,x); //cout<<"add "<<max(r-l+1,0)<<" "<<g[k+1]%mod<<endl; (res+=max(r-l+1,0)*1ll*g[k+1]%mod)%=mod; } } for(int &x:A)if(x)x=lower_bound(B.begin(),B.end(),x)-B.begin();else x=-1; up(i,0,n)vis[i]=0;vector<int>T; up(i,0,sz-1){ up(j,i,sz-1){ S[i][j]=0; int x=B[i],y=B[j]; up(k,1,x+y){ int l=max(k-y,1),r=min(k-1,x); (S[i][j]+=max(r-l+1,0)*1ll*g[k+2]%mod)%=mod; }S[j][i]=S[i][j]; } }up(i,2,int(A.size())-1){ if(A[i-2]!=-1){ if(!vis[A[i-2]])T.p_b(A[i-2]); vis[A[i-2]]++; } if(A[i]==-1)continue; for(int x:T)(res+=vis[x]*1ll*S[A[i]][x]%mod)%=mod; }printf("%d\n",res); }int main(){ //freopen("blossom.in","r",stdin); //freopen("blossom.out","w",stdout); int t=read();while(t--)slv(); fclose(stdin); fclose(stdout); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; } //i!/(i-k+1)!(n-k+1)!=C(n-k+1,n-i)*(n-i)!*i!