P12415 「YLLOI-R1-T4」枫
P12415\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU-P12415} }{{\color{Red}\Large Solution} }\mathbf{} {No.24} \end{Bmatrix}\times{}\) NeeDna
题意:
有一个 \(n*m\) 的网格,在其中画树,树满足 \(Y_{son} > Y_{father}\) 其中 \(Y\) 代表行数,求数的个数。
解决:
设 \(f_{i,j}\) 为前 \(i\) 行放了 \(j\) 个点的方案数。
我们需要分别枚举父亲,儿子时间复杂度 \(O(n^2 m^2)\)。
\(f_{i,j}=\sum_{k=0}^{j} f_{i-1,k}\times(j-k)^k\times C_{j-k}^{k}\)
#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
#define N 85
using namespace std;
int n,m,ans,f[N][N*N],c[N][N],p[N*N][N];
signed main()
{
ios::sync_with_stdio(0);
cin>>n>>m;
f[1][1]=m,c[0][0]=1;
for(int i=1;i<=m;i++)
{
c[i][0]=c[i][i]=1;
for(int j=1;j<i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
for(int i=1;i<=n*m;i++) p[i][0]=1;
for(int i=1;i<=n*m;i++) for(int j=1;j<=m;j++) p[i][j]=p[i][j-1]*i%mod;
for(int i=2;i<=n;i++) for(int j=1;j<=(i-1)*m;j++) for(int k=0;k<=m;k++) f[i][j+k]=(f[i][j+k]+f[i-1][j]*c[m][k]%mod*p[j][k])%mod;
for(int i=1;i<=n;i++) for(int j=0;j<=i*m;j++) ans+=f[i][j];
cout<<ans%mod;
return 0;
}

浙公网安备 33010602011771号