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
",ans);
    return 0;
}
me