BZOJ 1089: [SCOI2003]严格n元树
1089: [SCOI2003]严格n元树
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1591 Solved: 795
[Submit][Status][Discuss]
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
2 2
【样例输入2】
2 3
【样例输入3】
3 5
Sample Output
【样例输出1】
3
【样例输出2】
21
【样例输出2】
58871587162270592645034001
3
【样例输出2】
21
【样例输出2】
58871587162270592645034001
HINT
Source
分析
动态规划 + 高精度
dp_i表示深度为i的树的数目,dp_0 = dp_1 = 1
dp_i = Sum(dp_0...dp_i-1)^n - Sum(dp_0...dp_i-2)^n
代码
1 def main() : 2 line = raw_input().split() 3 n = int(line[0]) 4 m = int(line[1]) 5 if m == 0 : 6 print 1 7 else : 8 f = [1, 1] 9 s = [1, 2] 10 for i in range(2, m + 2) : 11 f.append(s[i - 1]**n - s[i - 2]**n) 12 s.append(s[i - 1] + f[i]) 13 print f[m] 14 15 if __name__ == "__main__" : main()
1 def main() : 2 line = raw_input().split() 3 n = int(line[0]) 4 m = int(line[1]) 5 if m == 0 : 6 print 1 7 else : 8 f = [1] 9 for i in range(0, m + 1) : 10 f.append(f[i]**n + 1) 11 print f[m] - f[m - 1] 12 13 if __name__ == "__main__" : main()
@Author: YouSiki