Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
32413 | masppy | 【S】T3 | C++ | 通过 | 100 | 967 MS | 80364 KB | 2165 | 2024-09-08 16:47:10 |
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=2e6+10; const ll inf=1e9; const ll mod=998244353; ll n,m,k,cnt[maxn],t,l,r,tp=0,id,len; ll a[maxn],b[maxn],fnt[maxn],f[maxn],sum[maxn],bck[maxn]; bool p[maxn]; ll q_pow(ll a,ll b){ ll res=1; while(b){ if(b&1){ res=(res*a)%mod; } b>>=1; a=(a*a)%mod; } return res; } ll calc(ll n,ll m){ if(n<m||n<0) return 0; // cout<<n<<" "<<m<<endl; return fnt[n]*bck[n-m]%mod*bck[m]%mod; } int main(){ // freopen("blossom.in","r",stdin); // freopen("blossom.out","w",stdout); scanf("%lld",&t); fnt[0]=bck[0]=1; for(int i=1;i<maxn;i++){ fnt[i]=fnt[i-1]*i%mod; bck[i]=q_pow(fnt[i],mod-2); // cout<<i<<" "<<fnt[i]<<" "<<bck[i]<<endl; } while(t--){ scanf("%lld%lld",&n,&m); memset(p,0,sizeof(p)); memset(cnt,0,sizeof(cnt)); for(int i=1;i<=m;i++) scanf("%lld",&l),p[l]=1; for(int i=1;i<=n;i++){ if(i==1) f[i]=0; else{ f[i]=fnt[i]*fnt[n-i]%mod*calc(n+1,i+1)%mod; } sum[i]=(sum[i-1]+f[i])%mod; // cout<<calc(n+1,i+1)<<" "<<sum[i]<<" "<<i<<endl; } a[n+1]=n+1; for(int i=n;i>=1;i--){ if(p[i+1]) a[i]=i+1; else a[i]=a[i+1]; } ll tmp=0; len=0; vector<int> q; b[n+1]=0; for(int i=n;i>=1;i--){ len++; if(p[i]){ b[i]=a[i]-i; if(b[a[i]]<=50)cnt[b[a[i]]]++; else q.push_back(b[a[i]]); //cout<<a[i]-i<<endl; tmp=(tmp+sum[a[i]-i])%mod; len=1; ll tmp1=0; for(int j=1;j<=50;j++){ tmp1+=cnt[j]*(sum[j+1]-sum[1]+mod)%mod; } int siz=q.size(); for(int j=0;j<siz;j++){ int v=q[j]; tmp1+=sum[v+1]-sum[1]+mod; } tmp=(tmp+tmp1)%mod; } else{ tmp+=sum[a[a[i]]-i]; ll tmp1=0; for(int j=1;j<=50;j++) tmp1+=cnt[j]*(sum[j+len]-sum[len]+mod)%mod; int siz=q.size(); for(int j=0;j<siz;j++){ int v=q[j]; tmp1+=sum[v+len]-sum[len]+mod; } tmp=(tmp+tmp1)%mod; } // cout<<tmp<<endl; } printf("%lld\n",tmp%mod); } fclose(stdin); fclose(stdout); return 0; }