题目来源:https://www.lydsy.com/JudgeOnline/problem.php?id=1089
1089: [SCOI2003]严格n元树
Time Limit: 1 Sec Memory Limit: 162 MB
Description
如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树。如果该树中最底层的节点深度为d
(根的深度为0),那么我们称它为一棵深度为d的严格n元树。例如,深度为2的严格2元树有三个,如下图:
给出n, d,编程数出深度为d的n元树数目。
Input
仅包含两个整数n, d( 0 < n < = 32, 0 < = d < = 16)
Output
仅包含一个数,即深度为d的n元树的数目。
Sample Input
【样例输入1】
2 2
【样例输入2】
2 3
【样例输入3】
3 5
Sample Output
【样例输出1】
3
【样例输出2】
21
【样例输出2】
58871587162270592645034001
-----------------------------------------------------
解题思路
高精度+动态规划
dp[i]:深度小于等于i的严格n元树的个数
深度小于等于i的严格n元树的根节点连接n棵深度小于等于(i-1)的严格n元子树,再加上一棵只有根节点的树
dp[i]= dp[i-1]^n+1
深度等于i的严格n元子树ans[i] =dp[i]-dp[i-1]
-----------------------------------------------------
代码
/* * 高精度+动态规划 * dp[i]: 深度小于等于i的严格n元树的个数 * 深度小于等于i的严格n元树的根节点连接n棵深度小于等于(i-1)的严格n元子树,再加上一棵只有根节点的树 * dp[i] = dp[i-1]^n+1 * 深度等于i的严格n元子树ans[i] = dp[i]-dp[i-1] */ import java.math.BigInteger; import java.util.Scanner; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int d = sc.nextInt(); BigInteger[] dp = new BigInteger[d+1]; // 可变大小的对象数组 dp[0] = new BigInteger("1"); // 用String构造BigInteger对象 // 深度为0,只有一个根节点 int i = 0; for (i=1; i<=d; i++) { dp[i] = dp[i-1].pow(n).add(new BigInteger("1")); } if (d==0) { System.out.println(1); } else { System.out.println(dp[d].subtract(dp[d-1])); } } }