提交时间:2024-09-15 20:06:51
运行 ID: 32625
#include<bits/stdc++.h> #define rf(i,a,b) for(int i=(a);i<=(b);i++) #define rb(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int N=1e3+10,V=310; int mod=998244353; int n,v; int f[2][N][V];bool vis[N][N][V];bool c[N]; int fac[N*5],inv[N*5]; int invp[V*6][V*3]; int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*a*x%mod;b>>=1;a=1ll*a*a%mod; }return x; }int lim=4e3+10; int C(int up,int down){ return 1ll*fac[down]*inv[up]%mod*inv[down-up]%mod; }struct nd{ int id,sm,vl; }; int main(){ fac[0]=1;rf(i,1,lim) fac[i]=1ll*fac[i-1]*i%mod; inv[lim]=qp(fac[lim],mod-2);rb(i,lim-1,0) inv[i]=1ll*inv[i+1]*(i+1)%mod; rf(i,1,lim/3) invp[i][0]=1,invp[i][1]=1ll*inv[i]*fac[i-1]%mod; rf(j,2,lim/6) rf(i,1,lim/6) invp[i][j]=1ll*invp[i][j-1]*invp[i][1]%mod; cin>>v>>n; int ans=0; f[0][0][v]=fac[n]; int fl=0; rf(i,1,n+2){ ans=(ans+1ll*f[fl][n][0]*(i-2)%mod)%mod; //cout<<ans<<endl; fl=1-fl; rf(j,0,n){ rf(k,0,v) f[fl][j][k]=0; } rf(j,0,n){ rf(k,0,v){ //if(i*k>n) continue; //cout<<i-1<<' '<<j<<' '<<k<<' '<<f[1-fl][j][k]<<endl; if(k==0) continue; rf(t,0,k){ if(j+t>n) continue; if(t*i>n) continue; //cout<<invp[k+1][t]<<' '<<t<<' '<<k<<endl; f[fl][j+t][t]+=1ll*f[1-fl][j][k]*C(t,k)%mod*invp[i][t]%mod; f[fl][j+t][t]%=mod; //cout<<p.id+1<<' '<<p.sm+i<<' '<<i<<endl; } } } } /*q.push((nd){0,0,v});int fl=1; while(!q.empty()){ nd p=q.front(); q.pop(); if(!c[p.id]){ c[p.id]=1;rf(i,1,n)rf(j,1,v) f[fl][i][j]=0;fl=1-fl; } //cout<<p.id<<' '<<p.sm<<' '<<p.vl<<' '<<f[p.id][p.sm][p.vl]<<endl; if(p.sm>n) continue;//if(p.id*p.vl>n) continue; if(p.sm==n&&p.vl==0){ ans=(ans+1ll*f[fl][p.sm][p.vl]*(p.id-1)%mod)%mod;continue; }if(p.vl==0) continue; rf(i,0,p.vl){ if(p.sm+i>n) continue; if(i*p.id+i>n) continue; f[1-fl][p.sm+i][i]+=1ll*f[fl][p.sm][p.vl]*C(i,p.vl)%mod*invp[p.id+1][i]%mod; f[1-fl][p.sm+i][i]%=mod; //cout<<p.id+1<<' '<<p.sm+i<<' '<<i<<endl; if(!vis[p.id+1][p.sm+i][i]) vis[p.id+1][p.sm+i][i]=1,q.push((nd){p.id+1,p.sm+i,i}); } }*/cout<<ans; return 0; }