[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();
}