1. 程式人生 > 其它 >2021牛客暑期多校訓練營4

2021牛客暑期多校訓練營4

比賽連結:https://ac.nowcoder.com/acm/contest/11255

C,F,I,J,排名還是不好;很多數學題,不太擅長,呆坐了幾個小時。

G:Product

#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;
    while
(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; }
me