提交时间:2024-09-08 13:22:23
运行 ID: 32261
#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" int n,m; bool p[1000300]; const int M=998244353; int res=0; int s[1000300],f[1000300]; inline int qp(int a,int x){ int res=1; while(x){ if(x&1)res=res*a%M; a=a*a%M; x>>=1; } return res; } inline int inv(int x){return qp(x,M-2);} int fac[2000300],iv[2000300]; inline int C(int n,int m){ if(n<m||n<0||m<0)return 0; return fac[n]*iv[m]%M*iv[n-m]%M; } inline void add(int &x,int y){ x+=y; if(x>=M)x-=M; } int sw[2003000],nxt[2000300]; const int B=50; int ct[1100]; signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("blossom.in","r",stdin); // freopen("blossom.out","w",stdout); int t; cin>>t; fac[0]=iv[0]=1; for(int i=1;i<2e6;i++) fac[i]=fac[i-1]*i%M,iv[i]=inv(fac[i]); while(t--){ cin>>n>>m; memset(p,0,sizeof(p)); for(int i=1;i<=m;i++){ int x; cin>>x; p[x]=1; } int res=0; for(int i=1;i<=n;i++) f[i]=(i==1?0:fac[i]*fac[n-i]%M*C(n+1,i+1)%M),s[i]=(s[i-1]+f[i])%M; nxt[n+1]=n+1; for(int i=n;i>=1;i--) nxt[i]=p[i+1]?i+1:nxt[i+1]; int len=0; memset(ct,0,sizeof(ct)); vector<int>T; sw[n+1]=0; for(int i=n;i>=1;i--){ len++; if(!p[i]){ add(res,s[nxt[nxt[i]]-i]); int sp=0; for(int i=1;i<=B;i++) sp+=ct[i]*(s[i+len]-s[len]+M); for(int x:T) sp+=s[x+len]-s[len]+M; add(res,sp%M); } else{ sw[i]=nxt[i]-i; if(sw[nxt[i]]<=B) ct[sw[nxt[i]]]++; else T.push_back(sw[nxt[i]]); add(res,s[nxt[i]-i]); len=1; int sp=0; for(int i=1;i<=B;i++) if(ct[i]) sp+=ct[i]*(s[i+len]-s[len]+M); for(int x:T) sp+=s[x+len]-s[len]+M; add(res,sp%M); } } cout<<res<<endl; } cout.flush(); fflush(stdout); return 0; } /* force: 2160 780 720 420 240 0 2484 924 900 420 240 0 */