首页 > 代码库 > BZOJ 1089: [SCOI2003]严格n元树

BZOJ 1089: [SCOI2003]严格n元树

1089: [SCOI2003]严格n元树

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 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

Sample Output

【样例输出1】
3

【样例输出2】
21

【样例输出2】
58871587162270592645034001

HINT

 

Source

 
[Submit][Status][Discuss]

 

分析

动态规划 + 高精度

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()
BZOJ_1089.py
技术分享
 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()
BZOJ_1089.py

 

@Author: YouSiki

BZOJ 1089: [SCOI2003]严格n元树