【bzoj1089】严格n元树

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

Solution

令s[i]为深度不超过i的n元树的数量

显然的s[i]=s[i-1]^n+1

加上高精度即可

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
using namespace std;
int n,d;
struct bignum{int len,s[301];
} f[101];
il bignum operator*(bignum a,bignum b){
    bignum c;
    memset(c.s,false,sizeof(c.s));
    c.len=a.len+b.len-1;
    for(int i=1;i<=a.len;i++)
        for(int j=1;j<=b.len;j++){
            c.s[i+j-1]+=a.s[i]*b.s[j];
            c.s[i+j]+=c.s[i+j-1]/10000;
            c.s[i+j-1]%=10000;
        }
    if(c.s[c.len+1]>0) c.len++;
    return c;
}
il void operator++(bignum &a){
    a.s[1]++;
    for(int i=1;i<=a.len;i++){
        a.s[i+1]+=a.s[i]/10000;
        a.s[i]%=10000;
    }
    if(a.s[a.len+1]>0) a.len++;
}
il bignum operator-(bignum a,bignum b){
    bignum c;
    memset(c.s,false,sizeof(c.s));
    c.len=a.len;
    for(int i=1;i<=c.len;i++){
        c.s[i]+=a.s[i]-b.s[i];
        if(c.s[i]<0) c.s[i+1]--;
        c.s[i]=(c.s[i]+10000)%10000;
    }
    return c;
}
il void print(bignum a){
    printf("%d",a.s[a.len]);
    for(int i=a.len-1;i>0;i--)
        printf("%04d",a.s[i]);
    printf("\n");
}
int main(){
    scanf("%d%d",&d,&n);
    if(d==0){
        cout<<"1";return 0;
    }
    f[0].len=1;f[0].s[1]=1;
    for(int i=1;i<=n;i++){
        f[i].len=1;f[i].s[1]=1;
        for(int j=1;j<=d;j++){
            f[i]=f[i]*f[i-1];
        //    print(f[i]);
        }
        ++f[i];
    }
    print(f[n]-f[n-1]);
    return 0;
}
时间: 2024-10-12 05:58:15

【bzoj1089】严格n元树的相关文章

SCOI2003 BZOJ1089 严格N元树

个人认为这是一道比较诡异的题,首先分享题目 如下: 描述 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d(根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严格2元树有三个,如下图: 给出n, d,编程数出深度为d的n元树数目.( 0   <   n   <   =   32,   0  < =   d  < = 16) 样例如下: [样例输入 1 ]2 2[样例输出 1 ]3[样例输入 2 ]2 3[样例输

bzoj1089严格n元树

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1089 这是一种套路:记录"深度为 i "的话,转移需要讨论许多情况:所以可以记录成"深度<=i"!!! (这种前缀和的样子得到答案也很方便,就是 f [ d ] - f [ d -1 ].) 这样的话把根节点拿出来,剩下的就是n个深度为 i - 1 的子树了. 当然,每个深度的情况里要包含"什么节点也没有"的情况,才能正确转移.所以要

[BZOJ1089][SCOI2003]严格n元树(递推+高精度)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1089 分析: 第一感觉可以用一个通式求出来,但是考虑一下很麻烦,不好搞的.很容易发现最底层必有一个是满高度的,其他的任意. 所以直接的递推也不好想. (以下所述都是n元树) 于是可以令f[d]为深度<=d的树的个数,那么深度为d的就是f[d]-f[d-1] 对于深度<=d的又该怎么处理呢? 考虑第一层的n个点(根为0层),每个点都要底下连子树,深度为0~i-1,方案数即f[d-1]

BZOJ1089 [SCOI2003]严格n元树

又是一道奇怪的DP(?)题一个非常好的想法是:令f[i]表示深度小于等于i的n元树的总个数,于是f[i] = f[i - 1] ^ n + 1 (这是因为加了一层以后新的根的n个儿子可以随便选,再加上没有儿子的情况)但是还要写高精...还好一边A了,手感不错~ 1 /************************************************************** 2 Problem: 1089 3 User: rausen 4 Language: Pascal 5 R

BZOJ 1089: [SCOI2003]严格n元树

Decription 询问深度为 \(d\) 的 \(n\) 元树个数, \(n\) 元树所有节点的孩子都有 \(n\) 个. Sol 递推+高精度. \(f[i]\) 表示深度为 \(i\) 的 \(n\) 元树个数,我这里深度是从 \([1,k+1]\) 的... 转移就是从上方添加一个节点,子节点任选然后再减去不合法的方案. \(f[i]=(\sum ^{i-1} _{j=1} f[j])^n-(\sum ^{i-2} _{j=1} f[j])^n\) Code #include<cstd

bzoj 1089 [SCOI2003]严格n元树(DP+高精度)

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元树数目. Inp

【BZOJ】【1089】【SCOI2003】严格n元树

高精度/递推 Orz Hzwer…… 然而我想多了…… 理解以后感觉黄学长的递推好精妙啊 顺便学到了一份高精度的板子= =233 引用下题解: f[i]=f[i-1]^n+1 ans=f[d]-f[d-1] 然后加个高精度... 话说这个数据范围是虚的吧... 极限数据根本不会做.. 1 /************************************************************** 2 Problem: 1089 3 User: Tunix 4 Language:

BZOJ 1089 SCOI2003 严格n元树 动态规划+高精度

题目大意:定义一棵深度为d的严格n元树为根的深度为0,最深的节点深度为d,且每一个非叶节点都有恰好n个子节点的树 给定n和d,求深度为d的严格n元树一共同拥有多少种 此题的递推部分并不难 首先我们设深度为i的严格n元树一共同拥有f[i]种 令S[i]为f[i]的前缀和 我们不难发现一棵深度为i下面的严格n元树由两部分组成:一个根节点,n棵子树.当中每棵子树的深度不超过i-1 每棵子树有S[i-1]种 一共n棵子树 于是S[i]=S[i-1]^n 嗯?是不是少了点东西?没错,另一种情况,这棵严格n

【BZOJ 1089】 [SCOI2003]严格n元树

1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 872  Solved: 445 [Submit][Status] Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d(根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严格2元树有三个,如下图: 给出n, d,编程数出深度为d的n元树数目. Input 仅包含两个