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;
}
posted @ 2025-06-28 15:36  NeeDna  阅读(8)  评论(0)    收藏  举报