题目要求对于所有相同颜色的点对(x,y),x到y的路径上的所有点的颜色都要与x和y相同。
相当于切掉树上的 x 条边(0<= x <= min(n-1,k-1)),让原树变成x+1个连通块,每个连通块涂成一个颜色,问有多少种方案;
ans =
C(n-1,i)是从n-1条边选i条边切,分成i+1个连通块,再在k种颜色内选i+1种给i+1个连通块上***r>预处理求下组合数,P(n,m)用C(n,m)*m!求得
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const int N = 305;
ll c[N][N],fac[N];
void init(){
//c[a][b],组合数
for(int i = 0;i < N;i++){
for(int j = 0;j <= i;j++){
if(!j) c[i][j] = 1;
else c[i][j] = (c[i-1][j]+c[i-1][j-1])%mod;
}
}
//fac[n],阶乘
fac[0] = 1;
for(int i = 1;i < N;i++){
fac[i] = (fac[i-1]*i)%mod;
}
}
int n,k;
int main(){
init();
while(~scanf("%d%d",&n,&k)){
for(int i = 1;i < n;i++){
int u,v;scanf("%d%d",&u,&v);
}
ll res = 0;
for(int i = 0;i <= min(n-1,k-1);i++){
res+=((c[n-1][i]%mod*c[k][i+1]%mod)%mod*fac[i+1])%mod;
res%=mod;
}
printf("%lld\n",res);
}
return 0;
}
京公网安备 11010502036488号