题意:给你一个 K叉的 D深度的完全树, 一共有1 到 (d-1) *k 权值的结点 ,子结点的权值大于父节点,问你有多少种树?
解法:最上面的顶点肯定是最小的!还剩(d - 1)* k - 1个结点,也就是还有选出k个(d - 1)深度的树
递推:f[n]=multiply{C(i*g[n-1],g[n-1])*f[n-1]}(1<=i<=k)。其实i从k到1比较好理解!QAQ看了好久木有看懂!还请教了CSU的斌牛!
连接:点击打开链接
代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String [] args) {
Scanner cin = new Scanner(System.in);
BigInteger[][] dp = new BigInteger[30][30];
int [][] g = new int[30][30];
for (int i = 1; i <= 21; i++) {
dp[i][0] = new BigInteger("1");
g[i][0] = 1;
for (int j = 1; i * j <= 21; j++) {
dp[i][j] = new BigInteger("1");
g[i][j] = i * g[i][j - 1];
g[i][j]++;
for (int k = i; k >= 1; k--)
dp[i][j] = dp[i][j].multiply(dp[i][j - 1].multiply(C(k * g[i][j - 1], g[i][j - 1])));
}
}
while (cin.hasNext()) {
int k = cin.nextInt();
int d = cin.nextInt();
System.out.println(dp[k][d]);
}
}
public static BigInteger C(int m, int n) {
if (m - n < n)
n = m - n;
BigInteger res = new BigInteger("1");
for (int i = 1; i <= n; i++)
res = res.multiply(BigInteger.valueOf(m - i + 1)).divide(BigInteger.valueOf(i));
return res;
}
}