题目大意:

求直径长度为N的无根二叉树的个数(同构的只算一种)

分析:

分析发现直径长度不好处理!因此考虑把问题转化一下:

假设要求直径为N的二叉树

(1)

若N为偶数,将树从直径中点的边断开,则分成了两个深度为 n/2 的有根树

(为什么要这么分?因为若深度大于 n/2 那么子书的直径就有可能大于n了!)

用num[n/2]代表n/2的有根树的个数 那么答案则为  c(num[n/2],2)+num[n/2]。。

(注意判重,c(x,x)部分代表两个子树不一样的情况,后面单独的num[]代表两个子树相同的情况,后面的统计跟这个类似,不过会麻烦一下,具体就不写了)

(2)

若N为奇数,直径中点是一个点,显然这个点可以连两个或者三个子树

其中至少有两个子树的深度为 n/2,还有一个子树可能为 0~n/2          (此处均为整数除法)

统计的时候分几种情况统计一下,!!记得注意判重,同时用 sum[n/2-1]保存 0~n/2-1的前缀和。

******

以上解决了统计答案的问题,剩下的问题是如何求出 深度为K的有根数的个数!

对于一个深度为K的树,先确定它的根,那么根的左右子树中至少有一个子树的深度为 K-1 ,另外一个可能为 0~K-1

还是记录前缀和,统计一下加上判重就好了

代码:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define mod 1000000007
#define inv2 500000004
#define inv3 333333336
long long sum[];
long long num[];
void ini()
{
num[]=sum[]=;
num[]=;
sum[]=;
for(int i=;i<=;i++)
{
num[i]=((num[i-]+)*num[i-]%mod*inv2%mod+num[i-]*(sum[i-]+)%mod)%mod;
sum[i]=(sum[i-]+num[i])%mod;
}
}
int main()
{
ini();
int n;
while(scanf("%d",&n),n)
{
if(n==)
{
puts("");
continue;
}
long long ans;
if(n%)
{
ans=(num[n/]-)*(num[n/])%mod*(num[n/]-)%mod*inv2%mod*inv3%mod;
ans=(ans+num[n/]*(num[n/]-)%mod)%mod;
ans=(ans+num[n/])%mod;
ans=(ans+((num[n/]-)*num[n/]%mod*inv2%mod+num[n/])%mod*(sum[n/-]+)%mod)%mod;
}
else
{
ans=((num[n/]-)*(num[n/])%mod*inv2%mod+num[n/])%mod;
}
cout<<ans<<endl;
}
return ;
}

hdu5136:组合计数、dp的更多相关文章

  1. [ZJOI2010]排列计数 (组合计数/dp)

    [ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...

  2. BZOJ1079 [SCOI2008]着色方案[组合计数DP]

    $有a_{1}个1,a_{2}个2,...,a_{n}个n(n<=15,a_{n}<=5),求排成一列相邻位不相同的方案数.$ 关于这题的教训记录: 学会对于复杂的影响分开计,善于发现整体 ...

  3. luoguP4492 [HAOI2018]苹果树 组合计数 + dp

    首先,每个二叉树对应着唯一的中序遍历,并且每个二叉树的概率是相同的 这十分的有用 考虑\(dp\)求解 令\(f_i\)表示\(i\)个节点的子树,根的深度为\(1\)时,所有点的期望深度之和(乘\( ...

  4. Singer House CodeForces - 830D (组合计数,dp)

    大意: 一个$k$层完全二叉树, 每个节点向它祖先连边, 就得到一个$k$房子, 求$k$房子的所有简单路径数. $DP$好题. 首先设$dp_{i,j}$表示$i$房子, 分出$j$条简单路径的方案 ...

  5. hdu4779 组合计数+dp

    提交 题意:给了n*m的网格,然后有p个重型的防御塔,能承受1次攻击,q个轻型防御塔不能接受任何攻击,然后每个防御搭会攻击他所在的行和所在的列,最后求在这个网格上放至少一个防御塔的方案数, 我们枚举 ...

  6. [SDOI2010]地精部落[计数dp]

    题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...

  7. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

  8. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  9. 3.29省选模拟赛 除法与取模 dp+组合计数

    LINK:除法与取模 鬼题.不过50分很好写.考虑不带除法的时候 其实是一个dp的组合计数. 考虑带除法的时候需要状压一下除法操作. 因为除法操作是不受x的大小影响的 所以要状压这个除法操作. 直接采 ...

  10. bzoj 1004 Cards 组合计数

    这道题考察的是组合计数(用Burnside,当然也可以认为是Polya的变形,毕竟Polya是Burnside推导出来的). 这一类问题的本质是计算置换群(A,P)中不动点个数!(所谓不动点,是一个二 ...

随机推荐

  1. [转] 深入剖析 linux GCC 4.4 的 STL string

    本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术. 平台:x86_64-redhat-linux gcc ver ...

  2. linux命令之partprobe

    使用fdisk工具只是将分区信息写入到磁盘,如果需要使用mkfs格式化并使用分区,则需要重新启动系统.partprobe 是一个可以修改kernel中分区表的工具,可以使kernel重新读取分区表而不 ...

  3. PLSQL编程基础

    一 PL/SQL简介 1 SQL:结构化的查询语句 2 PL/SQL优点与特性: 提高运行效率==>>提高运行效率的其他方式(存储过程,分页,缓存,索引) 模块化设计 允许定义标识符(变量 ...

  4. 封装函数--->切换,添加,删除class

    var obj={}; obj.className='a b c d active'; //切换class function toggle(obj,className) { var str=obj.c ...

  5. 增加Android模拟器的内存

    1,在window中,打开'C:\Users\Administrator\.android\avd\4.4.2.avd\config.ini'文件(我的是win7,xp的貌似不是'Users',是'D ...

  6. 原生js 学习之array 数组

    Array的原生方法:  concat(): 连接两个或更多的数组哦 join(): 把数组的所有元素放在一个字符串中 pop():删除并返回数组的最后一个元素 push():向数组的末尾添加一个元素 ...

  7. uva 10077 - The Stern-Brocot Number System

    想法: 初始化三個數L=0/1, M=1/1, R=1/0,設輸入的分數為a: 如果a<M,那麼要往左邊走,    R = M;    M = (L分子+M分子)/(L分母+M分母); 如果a& ...

  8. uva 12207 - That is Your Queue

    #include <cstdio> #include <iostream> #include <deque> using namespace std; int ma ...

  9. void *memmove( void* dest, const void* src, size_t count );数据拷贝,不需要CPU帮助

    分享到 腾讯微博 QQ空间 新浪微博 人人网 朋友网 memmove 编辑词条 编辑词条 -->   memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,m ...

  10. vim学习心得(一)——Cygwin下vim配置

    关于Vi有很多传说.其中最为著名的是: “Vi是编辑器之神,Emacs是神的编辑器” Emacs没有用过,但是Vi在Linux经常使用,所以,掌握好vi非常重要!!! Vim(Vi Improved) ...