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



题解

设f[d]为深度不大于d的n元树的个数,显然答案就是f[d] - f[d - 1]

对于考虑f[d]的根节点,它的每一棵子树方案数都是f[d - 1],用乘法原理:

f[d] = f[d - 1] ^ n + 1【+1考虑只有一个根节点】

边界:f[0] = 1

再者就是高精【好久没写高精乘高精了】,写的时候还需要先调一下

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define fo(i,x,y) for (int i = (x); i <= (y); i++)
#define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 20,maxm = 205,INF = 1000000000; int N,D; struct NUM{
int n[maxm],len;
NUM() {memset(n,0,sizeof(n)); len = 0;}
}f[maxn]; inline istream& operator >>(istream& in,NUM& a){
string s;
in>>s;
a.len = s.length();
for (int i = 0; i < a.len; i++) a.n[i] = s[a.len - i - 1] - '0';
return in;
} inline ostream& operator << (ostream& out,const NUM& a){
if (!a.len) out<<0;
else {
for (int i = a.len - 1; i >= 0; i--) out<<a.n[i];
}
return out;
} inline NUM operator *(const NUM& a,const NUM& b){
NUM c;
c.len = a.len + b.len + 2;
int carry = 0,temp;
for (int i = 0; i < a.len; i++){
for (int j = 0; j < b.len; j++){
temp = c.n[j + i] + a.n[i] * b.n[j] + carry;
c.n[j + i] = temp % 10;
carry = temp / 10;
}
int len = i + b.len;
while (carry) {
temp = c.n[len] + carry;
c.n[len] = temp % 10;
carry = temp / 10;
len++;
}
}
while (!c.n[c.len - 1]) c.len--;
return c;
} inline NUM operator + (const NUM& a,const int& b){
NUM c = a;
int temp = c.n[0] + b,carry = temp / 10;
c.n[0] = temp % 10;
for (int i = 1; carry && i < c.len; i++){
temp = c.n[i] + carry;
c.n[i] = temp % 10;
carry = temp / 10;
}
if (carry) c.n[c.len++] = carry;
return c;
} inline NUM operator - (const NUM& a,const NUM& b){
NUM c;
c.len = a.len;
int carry = 0;
for (int i = 0; i < a.len; i++){
c.n[i] = a.n[i] - b.n[i] + carry;
if (c.n[i] < 0) c.n[i] += 10,carry = -1;
else carry = 0;
}
while (!c.n[c.len - 1]) c.len--;
return c;
} inline NUM qpow(NUM a,int b){
NUM ans; ans.n[0] = ans.len = 1;
for (; b; b >>= 1,a = a * a)
if (b & 1) ans = ans * a;
return ans;
} int main()
{
/*cin>>f[0]>>f[1];
cout<<f[0] * f[1]<<endl;*/ cin>>N>>D;
if (!D) {cout<<1<<endl;return 0;}
f[0].n[0] = f[0].len = 1;
for (int i = 1; i <= D; i++){
f[i] = qpow(f[i - 1],N) + 1;
}
cout<<f[D] - f[D - 1]<<endl;
return 0;
}

BZOJ1089 [SCOI2003]严格n元树 【dp + 高精】的更多相关文章

  1. bzoj1089 [SCOI2003]严格n元树(dp+高精)

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1899  Solved: 954[Submit][Statu ...

  2. BZOJ1089:[SCOI2003]严格n元树(DP,高精度)

    Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...

  3. BZOJ1089: [SCOI2003]严格n元树

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 762  Solved: 387[Submit][Status ...

  4. P4295 [SCOI2003]严格N元树 DP

    思路:DP 提交:\(5\)次 错因:2次高精写错(我太菜了),2次写错特判 题解: 设\(f[i]\)表示深度\(\leq i\)的严格\(n\)元树的数目,有 \[f[i]=pow(f[i-1], ...

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

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1089 分析: 第一感觉可以用一个通式求出来,但是考虑一下很麻烦,不好搞的.很容易发现最 ...

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

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1250  Solved: 621[Submit][Statu ...

  7. 【BZOJ1089】[SCOI2003]严格n元树(高精度,动态规划)

    [BZOJ1089][SCOI2003]严格n元树(高精度,动态规划) 题面 BZOJ 洛谷 题解 设\(f[i]\)表示深度为\(i\)的\(n\)元树个数.然后我们每次加入一个根节点,然后枚举它的 ...

  8. SCOI2003 严格N元树

    SCOI2003 严格N元树 Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的 ...

  9. BZOJ 1089: [SCOI2003]严格n元树

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1591  Solved: 795[Submit][Statu ...

随机推荐

  1. Android开发笔记——ListView模块、缓存及性能

    ListView是Android开发中最常用的组件之一.本文将重点说明如何正确使用ListView,以及使用过程中可能遇到的问题. ListView开发模块 图片缓存 可能遇到的问题 一.ListVi ...

  2. XAF-如何改变列表点击时的默认行为

    在 Windows 窗体应用程序中,按下回车或双击列表会打开默认的详细视图. 在 ASP.NET Web 应用程序中,单击对象时执行此操作. 这一行为是由 ListViewProcessCurrent ...

  3. Jmeter使用JDBC链接数据库进行压力测试

    一.关于性能测试 对数据库进行压测时,我们需要关注的几个方面: 1.系统相关指标,诸如:系统CPU/内存/IO等 2.进程相关指标,诸如:mysql该数据库的对应的进程占用CPU/内存/IO等 3.数 ...

  4. Appium+python的单元测试框架unittest(2)——fixtures(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10046333.html) unittest提供的Fixtures用以在测试执行前和执行后进行必要的准备和清理工作,可 ...

  5. sql 命令使用简单记录

    半个月前就想记下用过的SQL命令的!!!     主题: 按时间查询: https://blog.csdn.net/hejpyes/article/details/41863349   左关联: se ...

  6. HttpServletResponse 之 sendError( )

    直接返回http 401状态,提示重新登录 response.sendError(401, "当前账户未登录或会话失效,请重新登录!) HTTP状态码列表: 100Continue继续.客户 ...

  7. 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)

    链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...

  8. TW实习日记:第五天

    今天可以说是非常忙的一天了,要再项目中实现微信相关的功能:授权登录以及扫码登录,还有就是自建应用的发送消息.首先功能代码其实在经过了几天的学习之后并没有很难,但是最让我难受的是在项目中去加代码,首先s ...

  9. 复利计算器4.0之再遇JUnit

    复利计算器4.0之再遇JUnit 前言    虽然之前的复利计算器版本已经尝试过使用JUnit单元测试,但由于没有系统性地学习过JUnit的使用,用得并不好,主要问题表现在测试的场景太少,并没有达到测 ...

  10. 1.2Linux下C语言开发基础(学习过程)

    ===============第二节  Linux下C语言开发基础=========== ********************** 重要知识点总结梳理********************* 一 ...