题目大意
给定三个整数
n
,
k
,
D
(
1
≤
n
,
k
≤
50
,
0
≤
D
≤
1
0
8
)
n,k,D(1≤n,k≤50,0≤D≤10^8)
n,k,D(1≤n,k≤50,0≤D≤108)
定义非负整数序列
a
a
a的权值为
D
!
∏
i
=
1
n
(
a
i
+
k
)
!
\frac{D!}{\prod\limits_{i=1}^{n}(a_i+k)!}
i=1∏n(ai+k)!D!
求所有满足以下条件的非负整数序列
a
a
a的权值和:
1.
∀
∈
[
1
,
n
]
,
a
i
≥
0
\forall\in[1,n],a_i \ge 0
∀∈[1,n],ai≥0
2.
∑
i
=
1
n
a
i
=
D
\sum_{i=1}^{n}a_i=D
∑i=1nai=D
答案对
998244353
998244353
998244353取模。
题解
code
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int c[3600][3600];
int f[60][3600];
int n,m,k,d;
int power(int x,int y)
{
int s=1;
for(;y;y/=2,x=1ll*x*x%mod)
if(y%2) s=1ll*s*x%mod;
return s;
}
void init()
{
int i,j,l;
for(i=0;i<3600;i++)
c[i][0]=1;
for(i=1;i<3600;i++)
for(j=1;j<=min(60,i);j++)
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
f[0][0]=1;
for(i=0;i<n;i++)
for(j=0;j<=i*(k-1);j++)
for(l=0;l<k;l++)
f[i+1][j+l]=(f[i+1][j+l]+1ll*f[i][j]*c[j+l][l])%mod;
}
int main()
{
int ans=0;
int i,j;
cin>>n>>k>>d;
init();
d+=n*k;
for(i=0;i<=n;i++)
{
int aa=1;
for(j=0;j<=i*(k-1);j++)
{
int aaa;
if(i%2) aaa=mod-c[n][i];
else aaa=c[n][i];
aaa=1ll*aaa*power(n-i,d-j)%mod*f[i][j]%mod*aa%mod;
ans=(ans+aaa)%mod;
aa=1ll*aa*(d-j)%mod*power(j+1,mod-2)%mod;
}
}
for(i=d-n*k+1;i<=d;i++)
ans=1ll*ans*power(i,mod-2)%mod;
cout<<ans;
return 0;
}