0
点赞
收藏
分享

微信扫一扫

BZOJ-1089: [SCOI2003]严格n元树 (递推+高精度)

木樨点点 2022-09-16 阅读 151

1089: [SCOI2003]严格n元树

Time Limit: 1 Sec  Memory Limit: 162 MB

Submit: 1955  Solved: 989

[​​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

阿西吧辣鸡高精度千进制mmp

python大法好!

f[i]=f[i-1]^n+1    cout<<f[d]-f[d-1];

1 n,d=map(int, raw_input().split())
2 if d==0:
3 print 1
4 else:
5 f=[1]
6 for i in range(0, d+1):
7 f.append(f[i]**n+1)
8 print

laj的辣鸡十进制高精度…… _(:зゝ∠)_

1 #include "bits/stdc++.h"
2 using namespace std;
3 typedef long long LL;
4 const int MAX=20005;
5 int n,m;
6 struct Node{
7 int a[MAX];
8 Node (){memset(a,0,sizeof(a));}
9 Node operator * (const Node &tt) {
10 Node an;
11 an.a[0]=a[0]+tt.a[0];
12 int i,j;
13 for (i=1;i<=a[0];i++)
14 for (j=1;j<=tt.a[0];j++)
15 an.a[i+j-1]+=a[i]*tt.a[j],
16 an.a[i+j]+=an.a[i+j-1]/10,
17 an.a[i+j-1]%=10;
18 while (an.a[an.a[0]]==0) an.a[0]--;
19 return an;
20 }
21 Node operator + (const Node &tt) {
22 int i,j;
23 Node an;an.a[0]=max(a[0],tt.a[0])+1;
24 for (i=1;i<=max(a[0],tt.a[0]);i++){
25 an.a[i]+=a[i]+tt.a[i];
26 an.a[i+1]+=an.a[i]/10;
27 an.a[i]%=10;
28 }
29 while (an.a[an.a[0]]==0) an.a[0]--;
30 return an;
31 }
32 Node operator - (const Node &tt) {
33 int i,j;
34 Node an; an.a[0]=a[0];
35 for (i=1;i<=a[0];i++){
36 if (a[i]<tt.a[i]) a[i+1]--,a[i]+=10;
37 an.a[i]=a[i]-tt.a[i];
38 }
39 while (an.a[an.a[0]]==0) an.a[0]--;
40 return an;
41 }
42 void out(){
43 int i,j;
44 for (i=a[0];i>=1;i--) printf("%d",a[i]);
45 }
46 }f[55];
47 Node ksm(Node x,int y){
48 Node an;an.a[0]=an.a[1]=1;
49 while (y){
50 if (y&1) an=an*x;
51 x=x*x;
52 y>>=1;
53 }
54 return an;
55 }
56 int main(){
57 freopen ("tree.in","r",stdin);freopen ("tree.out","w",stdout);
58 int i,j;
59 scanf("%d%d",&n,&m);
60 f[0].a[0]=f[0].a[1]=1;
61 for (i=1;i<=m;i++)
62 f[i]=ksm(f[i-1],n)+f[0];
63 Node ans=f[m]-f[m-1];
64 ans.out();
65 return 0;
66

 

举报

相关推荐

0 条评论