BZOJ 1089: [SCOI2003]严格n元树

时间:2023-03-08 16:58:25

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元树有三个,如下图:

BZOJ 1089: [SCOI2003]严格n元树

  给出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

代码

 def main() :
line = raw_input().split()
n = int(line[0])
m = int(line[1])
if m == 0 :
print 1
else :
f = [1, 1]
s = [1, 2]
for i in range(2, m + 2) :
f.append(s[i - 1]**n - s[i - 2]**n)
s.append(s[i - 1] + f[i])
print f[m] if __name__ == "__main__" : main()

BZOJ_1089.py

 def main() :
line = raw_input().split()
n = int(line[0])
m = int(line[1])
if m == 0 :
print 1
else :
f = [1]
for i in range(0, m + 1) :
f.append(f[i]**n + 1)
print f[m] - f[m - 1] if __name__ == "__main__" : main()

BZOJ_1089.py

@Author: YouSiki