hdu5136:组合计数、dp
题目大意:
求直径长度为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的更多相关文章
- [ZJOI2010]排列计数 (组合计数/dp)
[ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...
- BZOJ1079 [SCOI2008]着色方案[组合计数DP]
$有a_{1}个1,a_{2}个2,...,a_{n}个n(n<=15,a_{n}<=5),求排成一列相邻位不相同的方案数.$ 关于这题的教训记录: 学会对于复杂的影响分开计,善于发现整体 ...
- luoguP4492 [HAOI2018]苹果树 组合计数 + dp
首先,每个二叉树对应着唯一的中序遍历,并且每个二叉树的概率是相同的 这十分的有用 考虑\(dp\)求解 令\(f_i\)表示\(i\)个节点的子树,根的深度为\(1\)时,所有点的期望深度之和(乘\( ...
- Singer House CodeForces - 830D (组合计数,dp)
大意: 一个$k$层完全二叉树, 每个节点向它祖先连边, 就得到一个$k$房子, 求$k$房子的所有简单路径数. $DP$好题. 首先设$dp_{i,j}$表示$i$房子, 分出$j$条简单路径的方案 ...
- hdu4779 组合计数+dp
提交 题意:给了n*m的网格,然后有p个重型的防御塔,能承受1次攻击,q个轻型防御塔不能接受任何攻击,然后每个防御搭会攻击他所在的行和所在的列,最后求在这个网格上放至少一个防御塔的方案数, 我们枚举 ...
- [SDOI2010]地精部落[计数dp]
题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...
- 【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是素数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- 3.29省选模拟赛 除法与取模 dp+组合计数
LINK:除法与取模 鬼题.不过50分很好写.考虑不带除法的时候 其实是一个dp的组合计数. 考虑带除法的时候需要状压一下除法操作. 因为除法操作是不受x的大小影响的 所以要状压这个除法操作. 直接采 ...
- bzoj 1004 Cards 组合计数
这道题考察的是组合计数(用Burnside,当然也可以认为是Polya的变形,毕竟Polya是Burnside推导出来的). 这一类问题的本质是计算置换群(A,P)中不动点个数!(所谓不动点,是一个二 ...
随机推荐
- 初探swift语言的学习笔记四(类对象,函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- yii 删除内容时增加ajax提示
环境 : 后台有新闻分类和新闻的文章,在分类下有文章存在的时候,不想用户删除分类 代码 controller public function actionDelete($id) { $data = C ...
- 用Hexo搭建属于自己的Blog
什么是Hexo 简单的来说,Hexo是一款基于Node.JS的静态博客框架,官方给它的描述是"A fast, simple & powerful blog framework&quo ...
- webform 简单的服务器控件。
服务器基本控件: 1 textbox text:获取或设置文本 textmode:单行/多行/密码... wrap:是否换行 rows:行数 ...
- Http 辅助类
using System; using System.Drawing; using System.IO; using System.Net; using System.Net.Cache; using ...
- JUnit报initializationError的解决方法
在新搭建的环境上测试时,一个模块发现错误: java.lang.NoClassDefFoundError:org/hamcrest/SelfDescribing 一看就是缺少Class.多方查找,发现 ...
- GUI对话框
消息对话框 public static void showMessageDialog(Component parentComponent,String message,String title,int ...
- linux初识-01简介
什么是linux: Linux是一个自由的,免费的,源码开发的操作系统Linux的特点: 开放性.多用户,多任务,具有丰富的网络功能 可靠的系统安全 良好的可移植性 良好的用户界面(命令界面和图形界面 ...
- Linux wget下载https类型文件报错解决方法 转自老左博客
原文链接:http://www.laozuo.org/3648.html 一般我们远程调用下载文件直接用wget就可以,一般文件路径类型是http.如果有遇到是https就会下载出错,稍微不注意的新手 ...
- javascript访问级别
JavaScript中没有官方的访问级别语法,JavaScript没有类似于Java语言智能搞得private或protected这样的访问级别关键字,默认情况下,,对象中所有的成员都是公有和可访问的 ...