zoukankan      html  css  js  c++  java
  • bzoj 1089 [SCOI2003]严格n元树(DP+高精度)

     

    1089: [SCOI2003]严格n元树

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

    Sample Output

    【样例输出1】
    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('
    ');
    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 }
  • 相关阅读:
    增加网站内容步骤
    简单使用
    dedecms的讲解 要求
    shop34-3-自动加载实现
    shop34-2-运转-平台分发
    shop34-1-目录布局
    match_controller
    match_model
    match_mvc
    laravel 路由
  • 原文地址:https://www.cnblogs.com/lidaxin/p/5097243.html
Copyright © 2011-2022 走看看