【CF724F】Uniformly Branched Trees

题意:询问n个点的每个非叶子点度数恰好等于d的不同构的无根树的数目。

$n\le 1000,d\le 10$。

题解:先考虑有根树的版本。我们用$DP(n,m,k)$表示n个点,其中根的度数为m,其余点度数为d,根的最大的儿子的子树不能超过k的方案数。转移时我们可以枚举有多少个子树大小为k的。假如有i个,则贡献为:$DP(n-ik,m-i,k-1)\times{{DP(k,d-1,k-1)+i-1} \choose{i}}$,采用记忆化搜索是一个非常优秀的方法。

如果是无根树呢?如果有一个点为重心,则我们令重心为根即可。如果有两个重心,我们枚举其中一个,用组合数算一算即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,m;
ll P;
ll ine[1010];
int f[1010][11][1010];
ll DP(int n,int d,int k)
{
k=min(k,n-1);
if(f[n][d][k]!=-1) return f[n][d][k];
if((n==1&&d==m-1)||(n==1&&!d)) return 1;
if(n==1||!k) return 0;
int j;
ll ret=DP(n,d,k-1),t=DP(k,m-1,k),tmp=1;
for(j=1;j*k<n&&j<=d;j++)
{
tmp=tmp*(t+j-1)%P*ine[j]%P;
ret=(ret+tmp*DP(n-k*j,d-j,k-1))%P;
}
return f[n][d][k]=ret;
}
int main()
{
scanf("%d%d%lld",&n,&m,&P);
if(n==1||n==2)
{
puts("1");
return 0;
}
if((n-2)%(m-1)!=0)
{
puts("0");
return 0;
}
int i;
ine[0]=ine[1]=1;
for(i=2;i<=n;i++) ine[i]=P-(P/i)*ine[P%i]%P;
memset(f,-1,sizeof(f));
ll ans=DP(n,m,(n-1)/2);
if(!(n&1))
{
ll t=DP(n/2,m-1,n/2-1);
ans=(ans+t*(t+1)/2)%P;
}
printf("%lld",ans);
return 0;
}

【CF724F】Uniformly Branched Trees 动态规划的更多相关文章

  1. CF724F Uniformly Branched Trees

    CF724F Uniformly Branched Trees 有根树可以统计.无根树难以统计.因为可以换根. 所以不让换根:只要两个无根树在重心位置不同构,就一定不同构 每个本质不同的树在重心位置统 ...

  2. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) F - Uniformly Branched Trees 无根树->有根树+dp

    F - Uniformly Branched Trees #include<bits/stdc++.h> #define LL long long #define fi first #de ...

  3. 【CF724F】Uniformly Branched Trees

    题意:询问n个点的每个非叶子点度数恰好等于d的不同构的无根树的数目. n≤1000,d≤10n≤1000,d≤10. 题解: 这题真的是一道非常好的题 首先考虑有根树 定义f[i][j][k]表示i个 ...

  4. 「Codeforces 724F」Uniformly Branched Trees

    题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...

  5. LEETCODE —— Unique Binary Search Trees [动态规划]

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  6. Codeforces Round #369 (Div. 2) C. Coloring Trees 动态规划

    C. Coloring Trees 题目连接: http://www.codeforces.com/contest/711/problem/C Description ZS the Coder and ...

  7. 高考集训讲课(To 高一)

    高考集训讲课(To 高一) 主要是怕下午讲着讲着把自己讲懵了,有一定的迷糊概率 经过机房的讨论,一致认为插头\(DP\)实用性不大,所以这次不讲了,先把重要的讲一讲. 顺便吐槽一下,凭什么另外几个人都 ...

  8. 『正睿OI 2019SC Day6』

    动态规划 \(dp\)早就已经是经常用到的算法了,于是老师上课主要都在讲题.今天讲的主要是三类\(dp\):树形\(dp\),计数\(dp\),\(dp\)套\(dp\).其中计数\(dp\)是我很不 ...

  9. Todo List

    Contest 11.13 2016ACM/ICPC亚洲区青岛站(5/13, solved 7/13) Training 11.06 2016年中国大学生程序设计竞赛(合肥)(solved 6/10) ...

随机推荐

  1. Android开发中常用的库总结(持续更新)

    这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjau ...

  2. mysql5.7 启动报发生系统错误2

    1. http://dev.mysql.com/downloads/mysql/        下载mysql5.7   zip包 2. 下载好后解压文件,解压的内容如图,您可以把内容解压到想要的位置 ...

  3. [原]unity3d ios平台内存优化(一)

    关于内存优化,人云亦云 各有己见.本文将通过设置Strpping Level ,减少内存使用. 先看三幅图: 1.没做任何优化,默认选项 2.设置Stripping level 为 Use micro ...

  4. linux 最大文件查找

    sudo du -s * | sort -nr | head   显示前10个占用空间最大的文件或目录 sudo du --max-depth=1         linux查找占空间最大的文件与目录 ...

  5. 如何用一个for循环打印出一个二维数组

    思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...

  6. 对象克隆技术Object.clone()

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象. 所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象. ...

  7. ios开发之--armv7,armv7s,arm64,i386,x86_64详解

    有时候在运行的时候,经常出现诸如i386的错误,最新一些可能会出现 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch ...

  8. 1. Oracle安装部署文档

    一. 部署环境步骤 1.1 软件环境 操作系统:CentOS release 6.5oracle安装包:linux.x64_11gR2_database_1of1.zip:linux.x64_11gR ...

  9. MySQL,查看连接数和状态等

    1.MySQL> show status like '%connect%'; Connections,试图连接到(不管是否成功)MySQL服务器的连接数.   Max_used_connecti ...

  10. DrawCall 优化 .

    unity3D 对于移动平台的支持无可厚非,但是也有时候用Unity3D 开发出来的应用.游戏在移动终端上的运行有着明显的效率问题,比如卡.画质等各种问题.自己在做游戏开发的时候偶有所得.对于主要影响 ...