[BZOJ]1089 严格n元树(SCOI2003)
十几年前的题啊……果然还处于高精度遍地走的年代。不过通过这道题,小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)的更多相关文章
- BZOJ 1089 严格n元树 (递推+高精度)
题解:用a[i]表<=i时有几种树满足度数要求,那么这样就可以递归了,a[i]=a[i-1]^n+1.n个节点每个有a[i-1]种情况,那么将其相乘,最后加上1,因为深度为0也算一种.那么答案就 ...
- 【BZOJ】【1089】【SCOI2003】严格n元树
高精度/递推 Orz Hzwer…… 然而我想多了…… 理解以后感觉黄学长的递推好精妙啊 顺便学到了一份高精度的板子= =233 引用下题解: f[i]=f[i-1]^n+1 ans=f[d]-f[d ...
- BZOJ 1089: [SCOI2003]严格n元树
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1591 Solved: 795[Submit][Statu ...
- bzoj 1089 [SCOI2003]严格n元树(DP+高精度)
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1250 Solved: 621[Submit][Statu ...
- 【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)
http://www.lydsy.com/JudgeOnline/problem.php?id=1089 题意:求深度为d的n元树数目.(0<n<=32, 0<=d<=16) ...
- BZOJ 1089 SCOI2003 严格n元树 动态规划+高精度
题目大意:定义一棵深度为d的严格n元树为根的深度为0,最深的节点深度为d,且每一个非叶节点都有恰好n个子节点的树 给定n和d,求深度为d的严格n元树一共同拥有多少种 此题的递推部分并不难 首先我们设深 ...
- bzoj 1089 SCOI2003严格n元树 递推
挺好想的,就是一直没调过,我也不知道哪儿的错,对拍也拍了,因为数据范围小,都快手动对拍了也不知道 哪儿错了.... 我们定义w[i]代表深度<=i的严格n元树的个数 那么最后w[d]-w[d-1 ...
- bzoj 1089: [SCOI2003]严格n元树【dp+高精】
设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i-1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i-1]种 写个高精就行了,好久没写WA了好几次-- #incl ...
- BZOJ 1089 (SCOI 2003) 严格n元树
Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...
随机推荐
- Hibernate之深入持久化对象
Hibernate是一个彻底的O/R Mapping 框架.之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全 面 ...
- bzoj千题计划243:bzoj2325: [ZJOI2011]道馆之战
http://www.lydsy.com/JudgeOnline/problem.php?id=2325 设线段树节点区间为[l,r] 每个节点维护sum[0/1][0/1] 从l的A/B区域到r的 ...
- java实现红包的分配算法
个人推测,微信红包在发出的时候已经分配好金额.比如一个10元的红包发给甲乙丙三个人,其实在红包发出去的时候,已经确定了第一个会领取多少,第二个会领取多少金额. 而不是在领取的时候才计算的.下面贴出实现 ...
- Spring Security入门(2-3)Spring Security 的运行原理 3
关键组件关系 FilterSecurityInterceptor--- authenticationManager --- UserDetailService--- accessDecisionMan ...
- Spring-Boot导入配置文件与取值
前言: springboot简化了大量配置文件,但是必要时还是需要导入配置文件的,比如dubbo,此处简记之. 正文: 所有的配置文件引入都是使用注解在类上进行引入的,常用的有两种注解@Propert ...
- python/Djangof分页与自定义分页
python/Djangof分页与自定义分页 Django分页 ##============================================分页==================== ...
- python--Selectors模块/队列
Selectors模块/队列 一 Selectors模块 IO多路复用实现机制 Win: select Linux:select(效率低) poll epoll(最好)默认选择epoll sele ...
- 关于PHP包含文件的方法
Begin 今天陆陆续续在重新写一些后台程序,用到了一些共用的PHP文件,所以顺便学习了一下几种包含文件方式 include 最常用的包含文件方法,如果遇到错误会显示warning,但是不会影响下面脚 ...
- spark2.1:在RDD[unit].foreach(s=>{})内部调用sparkSession对象抛出NullPointException
问题代码: val sample_data_combine_result=List( (0,(List(FitModel(4022,1447.92,-8.38983306721434,2.0),Fit ...
- php实现记住密码自动登录的功能
$username=trim($_POST['username']); $password=md5(trim($_POST['password'])); $ref_url=$_GET['req_url ...