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

本文介绍了一种使用高精度递推算法来计算特定深度的严栔n元树数量的方法。通过定义严栔n元树的概念,并给出具体的计算公式,实现了对于任意给定的n和深度d情况下树的数量计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[Problem Description]
如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树。如果该树中最底层的节点深度为d(根的深度为0),那么我们称它为一棵深度为d的严格n元树。例如,深度为2的严格2元树有三个,如下图:  给出n, d,编程数出深度为d的n元树数目。
[Algorithm]
递推 高精度
[Analysis]
首先用高精度这是肯定的,光看样例就可以看出来。设F[i]表示0~i深度的严格n元树有多少种。很明显
F[i] = F[i - 1] ^ n + 1
然后高精度即可
[Code]
/**************************************************************
    Problem: 1089
    User: gaotianyu1350
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1272 kb
****************************************************************/
 
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;
 
const int MAXLEN = 1000;
 
class HighNumber
{
public:
    int num[MAXLEN], len;
    HighNumber()
    {
        memset(num, 0, sizeof(num));
        len = 0;
    }
    HighNumber operator = (HighNumber b)
    {
        memset(num, 0, sizeof(num));
        len = b.len;
        for (int i = 1; i <= len; i++)
            num[i] = b.num[i];
        return (*this);
    }
    HighNumber operator = (int b)
    {
        memset(num, 0, sizeof(0));
        if (b == 0)
        {
            len = 1;
            return (*this);
        }
        len = 0;
        while (b > 0)
        {
            num[++len] = b % 10;
            b /= 10;
        }
        return (*this);
    }
    HighNumber operator * (HighNumber b)
    {
        HighNumber ans;
        ans = 0;
        if (len == 1 && num[1] == 0 || b.len == 1 && b.num[1] == 0)
            return ans;
        ans.len = len + b.len - 1;
        for (int i = 1; i <= len; i++)
        for (int j = 1; j <= b.len; j++)
        {
            ans.num[i + j - 1] += num[i] * b.num[j];
            ans.num[i + j] += ans.num[i + j - 1] / 10;
            ans.num[i + j - 1] %= 10;
        }
        if (ans.num[ans.len + 1]) ans.len++;
        return ans;
    }
    HighNumber operator - (HighNumber b)
    {
        HighNumber ans;
        ans = 0;
        ans.len = len;
        for (int i = 1; i <= len; i++)
        {
            ans.num[i] += num[i] - b.num[i];
            if (ans.num[i] < 0)
            {
                ans.num[i + 1]--;
                ans.num[i] += 10;
            }
        }
        while (ans.len > 1 && !ans.num[ans.len]) ans.len--;
        return ans;
    }
    HighNumber operator + (HighNumber b)
    {
        HighNumber ans;
        ans = 0;
        ans.len = max(len, b.len);
        for (int i = 1; i <= ans.len; i++)
        {
            ans.num[i] += num[i] + b.num[i];
            ans.num[i + 1] = ans.num[i] / 10;
            ans.num[i] %= 10;
        }
        if (ans.num[ans.len + 1]) ans.len++;
        return ans;
    }
    void print()
    {
        for (int i = len; i >= 1; i--)
            printf("%d", num[i]);
        putchar('\n');
    }
};
 
int main()
{
    int n, deep;
    scanf("%d%d", &n, &deep);
    if (deep == 0) 
    {
        printf("1\n");
        return 0;
    }
    HighNumber fpre, fnow, f1;
    fpre = 1, f1 = 1;
    for (int i = 1; i <= deep; i++)
    {
        fnow = 1;
        for (int j = 1; j <= n; j++)
            fnow = fnow * fpre;
        fnow = fnow + f1;
        if (i != deep) fpre = fnow;
    }
    fnow = fnow - fpre;
    fnow.print();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值