Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
32391 LYLAKIOI 【S】T3 C++ 通过 100 671 MS 38596 KB 3865 2024-09-08 16:32:21

Tests(20/20):


#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 t1[maxn],t2[maxn]; void upd(int l,int r,int k,int b,int sgn){if(l>r)return; k=(k+mod)%mod,b=(b+mod)%mod; k=k*1ll*sgn%mod,b=b*1ll*sgn%mod; //cout<<"upd "<<l<<" "<<r<<" "<<k<<" "<<b<<endl; (t1[l]+=k)%=mod,t1[r+1]=(t1[r+1]+mod-(k+b*1ll*(r-l)%mod)%mod)%mod; (t2[l+1]+=b)%=mod,t2[r+1]=(t2[r+1]+mod-b)%mod; }void qry(){ up(i,1,n)(t2[i]+=t2[i-1])%=mod; up(i,1,n)(t2[i]+=t2[i-1])%=mod; up(i,1,n)t1[i]=(t1[i-1]+t1[i])%mod; up(i,1,n)t1[i]=(t1[i]+t2[i])%mod; } void modify(int x,int y,int k,int sgn){ if((!x)||(!y))return; //cout<<"modify "<<x<<" "<<y<<" "<<k<<" "<<sgn<<endl; sgn=(sgn+mod)%mod; if(x>y)swap(x,y); upd(2+k,x+1+k,1,1,sgn); if(x<y)upd(x+1+k+1,y+k+1-1,x,0,sgn),upd(y+1+k,x+y+k,x,-1,sgn); else upd(y+1+k+1,x+y+k,x-1,-1,sgn); } 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; memset(t1,0,sizeof(int)*(n+5)),memset(t2,0,sizeof(int)*(n+5)); memset(t,0,sizeof(int)*(n+5)); 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()); up(i,0,int(A.size())-2)modify(A[i],A[i+1],1,1),modify(A[i],A[i+1],2,-1); up(i,0,int(A.size())-1)t[A[i]]++; int sz=B.size(); up(i,0,sz-1)up(j,i,sz-1){ if(i==j)modify(B[i],B[j],2,t[B[i]]*1ll*(t[B[i]]-1)/2%mod); else modify(B[i],B[j],2,t[B[i]]*1ll*t[B[j]]%mod); }qry(); up(i,0,n)(res+=t1[i]*1ll*g[i]%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!


测评信息: