十几年前的题啊……果然还处于高精度遍地走的年代。不过通过这道题,小C想mark一下n叉树计数的做法。

Description

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

  

  给出n,d,编程数出深度为d的n元树数目。

Input

  仅包含两个整数n,d。

Output

  仅包含一个数,即深度为d的n元树的数目。

Sample Input

  3 5

Sample Output

  58871587162270592645034001

HINT

  0 < n <= 32,0 <= d <=16,保证答案的十进制位数不超过200位。

Solution

  把题目中树的边看成点,点看成边,题目就转化为求深度为d的n叉树的个数(根节点深度为1)。

  直觉告诉我们,深度在d以内的树的个数 比 深度为d的树的个数 好求,所以,设f[d]=深度在d以内的树的个数。

  然后 深度为d的树的个数 = 深度在d以内的树的个数 - 深度在d-1以内的树的个数 = f[d] - f[d-1]。

  然而小C一开始还是没有头绪,开始DP打表观察规律。

  然后就观察出了递推式:f[x] = f[x-1]^n+1 (1<=x<=d , f[0] = 1)。

  仔细想想为什么呢?我们用n棵深度在x-1以内的树作为儿子,再加上根节点就变成深度在x以内的树啦!

  最后+1是因为还要加上深度为0的空树。

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MOD 10000
#define MS 400
#define MN 20
using namespace std;
struct hp
{
int len,a[MS];
void add() {++a[];}
friend hp operator-(const hp& A,const hp& B)
{
hp C=A;
register int i;
for (i=;i<=B.len;++i)
{
C.a[i]-=B.a[i];
if (C.a[i]<) --C.a[i+],C.a[i]+=MOD;
}
while (!C.a[C.len]) --C.len;
return C;
}
friend hp operator*(const hp& A,const hp& B)
{
hp C; C.len=A.len+B.len+;
register int i,j;
memset(C.a,,sizeof(C.a));
for (i=;i<=A.len;++i)
for (j=;j<=B.len;++j)
C.a[i+j-]+=A.a[i]*B.a[j];
for (i=;i<C.len;++i)
C.a[i+]+=C.a[i]/MOD,C.a[i]%=MOD;
while (!C.a[C.len]) --C.len;
return C;
}
}f[MN],ans;
int m,n; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} hp mi(hp x,int y)
{
hp z;
memset(z.a,,sizeof(z.a)); z.len=z.a[]=;
for (;y;y>>=,x=x*x) if (y&) z=z*x;
return z;
} int main()
{
register int i;
m=read(); n=read();
if (n<=) return *printf("");
f[].len=; f[].a[]=;
for (i=;i<=n;++i) f[i]=mi(f[i-],m),f[i].add();
ans=f[n]-f[n-];
printf("%d",ans.a[ans.len]);
for (i=ans.len-;i;--i) printf("%04d",ans.a[i]);
}

Last Word

  果然还是观察规律好用。

  一道还算不错的题因为掺了高精度而风评被害。

[BZOJ]1089 严格n元树(SCOI2003)的更多相关文章

  1. BZOJ 1089 严格n元树 (递推+高精度)

    题解:用a[i]表<=i时有几种树满足度数要求,那么这样就可以递归了,a[i]=a[i-1]^n+1.n个节点每个有a[i-1]种情况,那么将其相乘,最后加上1,因为深度为0也算一种.那么答案就 ...

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

    高精度/递推 Orz Hzwer…… 然而我想多了…… 理解以后感觉黄学长的递推好精妙啊 顺便学到了一份高精度的板子= =233 引用下题解: f[i]=f[i-1]^n+1 ans=f[d]-f[d ...

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

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

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

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

  5. 【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1089 题意:求深度为d的n元树数目.(0<n<=32, 0<=d<=16) ...

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

    题目大意:定义一棵深度为d的严格n元树为根的深度为0,最深的节点深度为d,且每一个非叶节点都有恰好n个子节点的树 给定n和d,求深度为d的严格n元树一共同拥有多少种 此题的递推部分并不难 首先我们设深 ...

  7. bzoj 1089 SCOI2003严格n元树 递推

    挺好想的,就是一直没调过,我也不知道哪儿的错,对拍也拍了,因为数据范围小,都快手动对拍了也不知道 哪儿错了.... 我们定义w[i]代表深度<=i的严格n元树的个数 那么最后w[d]-w[d-1 ...

  8. bzoj 1089: [SCOI2003]严格n元树【dp+高精】

    设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i-1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i-1]种 写个高精就行了,好久没写WA了好几次-- #incl ...

  9. BZOJ 1089 (SCOI 2003) 严格n元树

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

随机推荐

  1. 创建带缩进的XML

    from xml.etree import ElementTree as ET from xml.dom import minidom root = ET.Element('}) son=ET.Sub ...

  2. 小草手把手教你 LabVIEW 串口仪器控制——初识VISA串口

    有些人,学习一样东西时候,喜欢现成的例子.很多人学习一门技术,都喜欢现成的例子开始,比如学单片机的啊,最开始都是修改的例子吧,学语言的也是.最开始都是模仿.这个年头看书上的理论知识太浪费时间了.所以啊 ...

  3. React 深入系列1:React 中的元素、组件、实例和节点

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...

  4. 使用IDEA快速插入数据库数据的方法

    如上图所示:数据库创建表主键使用了自增列自增因此忽略,只有后两列非主键得数据,在数据较多得时候使用IDEA快捷键Ctrl+R键,快速查找替换.

  5. keepalive配置支持ipv6、ipv4双棧支持

    因公司业务需要,keepalived需要同时支持ipv6和ipv4 keepalived版本1.2.23. keepalived 配置: 重点:ipv6的虚IP配置在 virtual_ipaddres ...

  6. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

  7. python--socket粘包

    socket粘包 1 什么是粘包 须知:只有TCP有粘包现象,UDP永远不会粘包,首先需要掌握一个socket收发消息的原理, 所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少 ...

  8. Nginx配置特定二级域名

    首先把先在域名设置页面把二级域名解析到服务器的公网IP上,这里假设是 bbs.domainname.com 然后编辑 /etc/nginx/sites-available/domain.com.con ...

  9. POJ-2993 Emag eht htiw Em Pleh---棋盘模拟

    题目链接: https://vjudge.net/problem/POJ-2993 题目大意: 输入和输出和这里相反. 思路: 模拟题,没啥算法,直接模拟,不过为了代码精简,还是花了一点心思的 #in ...

  10. hdu1005 Number Sequence---找循环节

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1005题目大意: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + ...