提交时间:2025-05-27 13:31:33
运行 ID: 37882
#include<bits/stdc++.h> #define ppc __builtin_popcount using namespace std; const int N=510,mod=998244353; void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} void Sub(int &a,int b){a-=b;if(a<0) a+=mod;} void Mul(int &a,int b){a=1ll*a*b%mod;} int qp(int a,int b){ int x=1; while(b){ if(b&1) Mul(x,a); Mul(a,a);b>>=1; }return x; } int n,m,k; int a[N],pre[N],sp[N<<1]; int C[N][N]; int glen(int l,int r,int all=n){ if(l>r) r+=all; return (r-l+1); } int gsum(int l,int r){ if(l>r) r+=n; return (sp[r]-sp[l-1]+mod)%mod; } int f[N][N],g[N][N]; int main(){ cin>>n>>m>>k; swap(n,m); for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) a[i]=(a[i]+(m-k)-1)%m+1; sort(a+1,a+n+1); for(int i=1;i<=n;i++) if(a[i]==k) k=i; C[0][0]=1; for(int i=1;i<=n;i++){ C[i][0]=1; for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod; } int iv=qp(m,mod-2); a[0]=a[n]; for(int i=1;i<=n;i++) pre[i]=1ll*glen(a[i-1]%m+1,a[i],m)*qp(m,mod-2)%mod; a[0]=0; for(int i=1;i<=n;i++) sp[i]=pre[i],sp[i+n]=pre[i]; for(int i=1;i<=n*2;i++) Add(sp[i],sp[i-1]); for(int i=1;i<=n+1;i++) f[i][i-1]=1; for(int i=n;i>=1;i--){ for(int j=i;j<=n;j++){ for(int k=i;k<=j;k++){ Add(f[i][j],1ll*f[i][k-1]*f[k+1][j]%mod* C[glen(i,j)-1][glen(i,k)-1]%mod*gsum(i,k)%mod); //cout<<f[i][k-1]<<' '<<f[k+1][j]<<' '<<glen(i,j)<<' '<<glen(i,k)<<endl; } //cout<<i<<' '<<j<<' '<<f[i][j]<<endl; } } //cout<<f[1][2]*12ll%mod<<endl; g[0][0]=1; for(int i=1;i<=n;i++){ for(int j=0;j<=n;j++){ for(int k=i;k<=n;k++){ int len=glen(i,k)-1; if(j+len>n) continue; int vl=1ll*f[i][k-1]*C[j+len][len]%mod; if(k==n) Mul(vl,gsum(i,k)); //cout<<i<<' '<<j<<' '<<k<<' '<<g[i-1][j]<<' '<<vl<<endl; Add(g[k][j+len],1ll*g[i-1][j]*vl%mod); }//cout<<i<<' '<<j<<' '<<g[i][j]*3ll%mod*12ll%mod<<endl; } } int ans=0; for(int i=0;i<=n;i++) Add(ans,1ll*g[n][i]*(i+1)%mod); cout<<ans<<endl; return 0; }