2021牛客暑期多校訓練營4
阿新 • • 發佈:2021-07-29
比賽連結:https://ac.nowcoder.com/acm/contest/11255
C,F,I,J,排名還是不好;很多數學題,不太擅長,呆坐了幾個小時。
#include<cstdio> #include<cstring> using namespace std; #define ll long long const int N=55,M=2605,mod=998244353; int n,k,D,dp[N][M],jc[M],jcn[M],ans; int pw(int n,int k) { int ret=1,mul=n; whileme(k) { if(k&1)ret=(ll)ret*mul%mod; mul=(ll)mul*mul%mod; k>>=1; } return ret; } int C(int n,int k) { return (ll)jc[n]*jcn[k]%mod*jcn[n-k]%mod; } void init() { //int r=n*k+1;//+1,for k=0 int r=51*51;/// jc[0]=1; for(int i=1;i<=r;i++)jc[i]=(ll)jc[i-1]*i%mod; jcn[r]=pw(jc[r],mod-2); for(int i=r-1;i>=1;i--)jcn[i]=(ll)jcn[i+1]*(i+1)%mod; jcn[0]=1; dp[0][0]=1; for(int i=1;i<=n;i++) for(int j=0,d=i*(k-1);j<=d;j++) for(int l=0;l<k&&l<=j;l++) { dp[i][j]=(dp[i][j]+(ll)dp[i-1][j-l]*C(j,l)%mod)%mod; } } int main() { scanf("%d%d%d",&n,&k,&D); init(); ans=pw(n,D+n*k); for(int i=1;i<=n;i++) { int sgn=1;if(i&1)sgn=mod-1; int mul=1; for(int j=0,d=(k-1)*i;j<=d;j++) { ans=(ans+(ll)sgn*C(n,i)%mod*dp[i][j]%mod*pw(n-i,D+n*k-j)%mod*mul%mod)%mod;/// mul=(ll)mul*(D+n*k-j)%mod*pw(j+1,mod-2)%mod; } } for(int i=D+1,d=D+n*k;i<=d;i++) ans=(ll)ans*pw(i,mod-2)%mod; printf("%d\n",ans); return 0; }