提交时间:2024-09-08 13:13:10
运行 ID: 32252
#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=2e5+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],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;} 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();set<int>S;up(i,1,m)S.insert(read()); up(i,0,n){ f[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[i]=g; } int mn=(*S.begin()),mx=(*(--S.end())); if(mn==mx){ int res=0; up(i,2,n){ int w=i-1; res+=(n-w)*1ll*f[n-i]%mod;res%=mod; }printf("%d\n",res);return; } int res=0; up(i,1,n)up(j,i+1,n){ int cnt=0; auto it=S.lower_bound(i); if(it==S.end()||(*it)>j)cnt=j-i+1; else { auto jt=S.upper_bound(j);--jt; if((*jt)==(*it))cnt=j-i+1; else cnt=(*it)-i+1+j-(*jt)+1; } (res+=f[n-cnt])%=mod; /*up(k,1,n){ (res+=A(k-1,n-cnt)*1ll*jc[n-k+1]%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!