第一行两个整数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); }