BZOJ1089 [SCOI2003]严格n元树 【dp + 高精】
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
2 2
【样例输入2】
2 3
【样例输入3】
3 5
Sample Output
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 + 高精】的更多相关文章
- bzoj1089 [SCOI2003]严格n元树(dp+高精)
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1899 Solved: 954[Submit][Statu ...
- BZOJ1089:[SCOI2003]严格n元树(DP,高精度)
Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...
- BZOJ1089: [SCOI2003]严格n元树
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 762 Solved: 387[Submit][Status ...
- P4295 [SCOI2003]严格N元树 DP
思路:DP 提交:\(5\)次 错因:2次高精写错(我太菜了),2次写错特判 题解: 设\(f[i]\)表示深度\(\leq i\)的严格\(n\)元树的数目,有 \[f[i]=pow(f[i-1], ...
- [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1089 分析: 第一感觉可以用一个通式求出来,但是考虑一下很麻烦,不好搞的.很容易发现最 ...
- bzoj 1089 [SCOI2003]严格n元树(DP+高精度)
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1250 Solved: 621[Submit][Statu ...
- 【BZOJ1089】[SCOI2003]严格n元树(高精度,动态规划)
[BZOJ1089][SCOI2003]严格n元树(高精度,动态规划) 题面 BZOJ 洛谷 题解 设\(f[i]\)表示深度为\(i\)的\(n\)元树个数.然后我们每次加入一个根节点,然后枚举它的 ...
- SCOI2003 严格N元树
SCOI2003 严格N元树 Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的 ...
- BZOJ 1089: [SCOI2003]严格n元树
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1591 Solved: 795[Submit][Statu ...
随机推荐
- github如何删除仓库中文件夹
github项目中,经常大家更新.添加都非常熟悉,但是如果想要删掉一个文件夹,很多人就不知道怎么操作了. 网上查了一些方法,大部分都是删除仓库重新上传,这样肯定是不行的,首先不说任务量大,而且删除仓库 ...
- oracle 查看锁表及解锁的语句
解锁语句: alter system kill session 'sid, serial#'; alter system kill session '23, 1647'; 查询那些对象被锁: sele ...
- linux部署MantisBT(一)部署apache
一.部署apache 1.下载apache安装包及依赖包 http://httpd.apache.org/download.cgi#apache24(apache2)http://apr.apache ...
- Centos7下安装Oracle11g r2
我的centos7是在virtualbox下安装的,安装Oracle安装了好久好久,最开始的时候在网上找的两个文章,按照步骤装,有一篇写着装的时候有灰色的竖线,直接按space键或者鼠标右键close ...
- Sorting a Three-Valued Sequence(三值排序)
Description 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2和3.我们用交换的 ...
- 软件工程团队项目第一个Sprint评论
(1)跑男:话说我没怎么听懂这个游戏是怎么玩的,可能是由于这是第一组,所以我没有反应过来把,界面设计的还可以,但是像设置,选关,帮助真心没看懂.有一种感觉就是,这个游戏是由一堆的漂亮的图片拼起来的,还 ...
- 通俗理解Hilbert希尔伯特空间
作者:qang pan 链接:https://www.zhihu.com/question/19967778/answer/28403912 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...
- python 动态获取当前运行的类名和函数名的方法
一.使用内置方法和修饰器方法获取类名.函数名 python中获取函数名的情况分为内部.外部,从外部的情况好获取,使用指向函数的对象,然后用__name__属性 复制代码代码如下: def a():pa ...
- 博弈---威佐夫博奕(Wythoff Game)
这个写的不错 威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同 时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况下是颇为复杂 ...
- Websphere Application Server 环境配置与应用部署最佳实践
在发布一个运行于 WebSphere Application Server 的 J2EE 应用之前,对服务器进行配置和部署应用是必不可少的一个过程,这个过程是非常复杂的.WAS 为用户提供了可视化的管 ...