第一行两个整数n,k代表点数和颜色数; 接下来n-1行,每行两个整数x,y表示x与y之间存在一条边;
输出一个整数表示方案数(mod 1e9+7)。
4 3 1 2 2 3 2 4
39
对于30%的数据,n≤10, k≤3; 对于100%的数据,n,k≤300。
#include<stdio.h>
const int maxn=300+5,mod=1e9+7;
long long dp[maxn][maxn],res=0;
int main(){
int n,k,i,j,x,y;
for(scanf("%d%d",&n,&k),i=0;i<n;i++) scanf("%d%d",&x,&y);
for(dp[0][0]=1,i=1;i<=n;i++)
for(j=1;j<=k;j++){
dp[i][j]=(dp[i-1][j]+dp[i-1][j-1]*(k-j+1))%(long long)mod;
if(i==n) res=(res+dp[i][j])%(long long)mod;
}
printf("%lld\n",res);
}