思路
我们知道树是联通的,即任意两点之间一定是可以到达的,那么题意等价
能将这棵树分成多少个联通块,并且最多只能分解k个联通块
那么其实这棵树的结构是怎么样的我们并不在乎
只需要考虑当前节点和上一个节点是不是要在同一个连通块即可
所以考虑dp
dp[i][j]表示前i个节点分成j个联通块的方案数
转移方程易得dp[i][j]=dp[i-1][j]+(k-(j-1))*dp[i-1][j-1]

即 要么第i个和第i-1个同一块 要么在剩下的k-(j-1)块中选一块
注意块和块是互不相同的 比如1在第一块 23在第二块 和1在第二块 23在第一块这是两种方案
边界的话就是dp[0][0]=1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll dp[505][505];
int main(){
    int n,k;
    cin>>n>>k;
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            dp[i][j]=(dp[i-1][j-1]*(k-j+1)%mod+dp[i-1][j])%mod;
        }
    }
    ll sum=0;
    for(int i=1;i<=k;i++) sum+=dp[n][i];
    cout<<sum%mod;

    return 0;
}