bzoj 1089 [SCOI2003]严格n元树(DP+高精度)
来源:互联网 发布:知乎登录页面 编辑:程序博客网 时间:2024/05/29 12:38
1089: [SCOI2003]严格n元树
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1250 Solved: 621
[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+高精度。
设f[i]表示高i的严格n元数的数目,并设S[i]表示f[i]的前缀和。一颗高i的严格n元树有一个根节点以及n个高不超过i-1的子树构成,每个子树方案为S[n-1],则有转移式:
S[i]=(S[i-1]^n)+1
1表示只有一个根的情况。
高精度照着别人的写的,重载运算符,用起来比较方便。
【代码】
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 6 const int maxn = 5000+10; 7 const int rad = 1000; 8 9 struct Bign { int N[maxn],len; };10 void print(Bign a) {11 printf("%d",a.N[a.len-1]);12 for(int i=a.len-2;i>=0;i--)13 printf("%03d",a.N[i]); //补全位数 14 putchar('\n');15 }16 Bign operator *(Bign A,Bign B) {17 Bign C;18 int lena=A.len,lenb=B.len;19 for(int i=0;i<lena+lenb;i++) C.N[i]=0;20 for(int i=0;i<lena;i++)21 for(int j=0;j<lenb;j++)22 C.N[i+j] += A.N[i]*B.N[j];23 C.len=A.len+B.len;24 for(int i=0;i<C.len;i++) 25 if(C.N[i]>=rad) {26 if(i==C.len-1) 27 C.len++ , C.N[i+1]=C.N[i]/rad;28 else C.N[i+1]+=C.N[i]/rad;29 C.N[i]%=rad;30 }31 while(C.len && !C.N[C.len-1]) C.len--;32 return C;33 }34 Bign operator ^(Bign A,int p) { //快速幂 35 Bign C;36 C.len=1; C.N[0]=1;37 while(p) {38 if(p&1) C=C*A; A=A*A; p>>=1;39 }40 return C;41 }42 Bign operator +(Bign A,int x) {43 A.N[0]+=x;44 int now=0;45 while(A.N[now]>=rad) {46 A.len=max(A.len,now+1);47 A.N[now+1]+=A.N[now]/rad;48 A.N[now]%=rad;49 now++;50 A.len=max(A.len,now);51 }52 return A;53 }54 Bign operator-(Bign A,Bign B) {55 for(int i=0;i<A.len;i++) {56 A.N[i]-=B.N[i];57 if(A.N[i]<0)58 A.N[i]+=rad , A.N[i+1]--;59 }60 while(A.len && !A.N[A.len-1]) A.len--;61 return A;62 }63 64 int n,d;65 Bign S[50];66 67 int main() {68 scanf("%d%d",&n,&d);69 if(!d) { puts("1"); return 0; }70 S[0].len=1; S[0].N[0]=1;71 for(int i=1;i<=d;i++)72 S[i]=(S[i-1]^n)+1;73 print(S[d]-S[d-1]);74 return 0;75 }
0 0
- bzoj 1089 [SCOI2003]严格n元树(DP+高精度)
- bzoj 1089: [SCOI2003]严格n元树 (dp+高精度)
- [BZOJ 1089][SCOI2003]严格n元树:DP+高精度
- [BZOJ]1089: [SCOI2003]严格n元树 DP+高精度
- BZOJ 1089: [SCOI2003]严格n元树(dp+高精度快速幂)
- BZOJ 1089 SCOI2003 严格n元树 动态规划+高精度
- BZOJ 1089: [SCOI2003]严格n元树 递推,高精度
- BZOJ 1089: [SCOI2003]严格n元树 递推 高精度
- 1089: [SCOI2003]严格n元树 DP+高精度
- 简单高精度模板(bzoj 1089: [SCOI2003]严格n元树)
- 【BZOJ 1089】 [SCOI2003]严格n元树
- [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
- [BZOJ1089][SCOI2003]严格n元树(dp+数学相关+高精度)
- [BZOJ1089][SCOI2003][递推][高精度]严格n元树
- 【BZOJ1089】[SCOI2003]严格n元树【递推】【高精度】
- BZOJ1089(SCOI2003)[严格n元树]--递推+高精度
- 1089: [SCOI2003]严格n元树
- 1089: [SCOI2003]严格n元树
- UVA 11478 Halum(差分约束)
- bzoj 2330 [SCOI2011]糖果(差分约束系统)
- bzoj 1602 [Usaco2008 Oct]牧场行走(LCA模板)
- bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)
- 1025. 反转链表
- bzoj 1089 [SCOI2003]严格n元树(DP+高精度)
- 浅谈《微信抢红包原理》
- 国家集训队论文【index】
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
- bzoj 1055 [HAOI2008]玩具取名(区间DP)
- bzoj 1560 [JSOI2009]火星藏宝图(DP)
- 使用正则表达式写一个网页爬虫案例获取指定文档中的邮件地址保存到自己指定的文件夹中
- 1026. 程序运行时间
- 【题解】2015年12月 测试试题