2种方法,一种是数学方法,一种是DP。
一.数学方法
这个记一波结论吧,至于组合数那就是Lucas定理啦。
二.DP
这个就比较简单易懂了
设dp[i][j]为一共有i个点,根节点有j个节点的方案数
#include<bits/stdc++.h> using namespace std; const int mod=10007; int n,m,dp[1001][1001]; int main() { cin>>n>>m; for(int i=0;i<=m;i++) dp[0][i]=1; for(int i=0;i<=m;i++) dp[1][i]=1; for(int i=2;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<i;k++) dp[i][j]=(dp[i][j]+dp[k][m]*dp[i-k][j-1]%mod)%mod; cout<<dp[n][m]; return 0; }