列表

详情


NC13611. 树

描述

shy有一颗树,树有n个结点。有k种不同颜色的染料给树染色。一个染色方案是合法的,当且仅当对于所有相同颜色的点对(x,y),x到y的路径上的所有点的颜色都要与x和y相同。请统计方案数。

输入描述

第一行两个整数n,k代表点数和颜色数; 接下来n-1行,每行两个整数x,y表示x与y之间存在一条边;

输出描述

输出一个整数表示方案数(mod 1e9+7)。

示例1

输入:

4 3
1 2
2 3
2 4

输出:

39

原站题解

import java.util.Scanner;
public class Main {
public static void main(String[] arg) {
Scanner scanner = new Scanner(System.in);
// todo
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 1164K, 提交时间: 2023-06-13 16:24:26

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=1e9+7;
int n,m,ans,f[305][305];
signed main()
{
scanf("%lld%lld",&n,&m);
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)f[i][j]=(f[i-1][j]+f[i-1][j-1]*(m-j+1)%p)%p;
for(int i=1;i<=m;i++)ans=(ans+f[n][i])%p;
cout<<ans;
}

C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 1136K, 提交时间: 2019-10-20 10:07:12

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

Python3 解法, 执行用时: 79ms, 内存消耗: 6876K, 提交时间: 2021-05-27 14:06:23

MOD = int(1e9 + 7)
n, k = map(int, input().split())
for _ in range(n - 1):
u, v = map(int, input().split())
f = [[0] * (k + 1) for _ in range(n + 1)]
f[0][0] = 1
for i in range(1, n + 1):
for j in range(1, k + 1):
f[i][j] = (f[i - 1][j] + f[i - 1][j - 1] * (k - j + 1)) % MOD
print(sum(f[-1]) % MOD)

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 1248K, 提交时间: 2020-04-18 16:48:24

#include<iostream>
using namespace std;
#define L long long
const L M=1e9+7;
L n,m,ans,f[303][303];
int main(){
cin>>n>>m;
f[0][0]=1;
for(L i=1;i<=n;i++)
for(L j=1;j<=m;j++) f[i][j]=(f[i-1][j]+f[i-1][j-1]*(m-j+1)%M)%M;
for(L i=1;i<=m;i++) ans=(ans+f[n][i])%M;
cout<<ans;
}

上一题