官方题解

可以用求概率的思想来解决这个问题。令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]个点。那么第i个点是第i棵子树最大值的概率为1/sz[i],不是最大值的概率为(sz[i]-1)/sz[i]。现在可以求解恰好有k个最大值的概率。

令dp[i][j]表示考虑编号从1到i的点,其中恰好有j个点是其子树最大值的概率。 很容易得到如下转移方程:dp[i][j]=dp[i-1][j]*(sz[i]-1)/sz[i]+dp[i-1][j-1]/sz[i]。这样dp[n][k]就是所有点中恰好有k个最大值的概率。

题目要求的是方案数,用总数n!乘上概率就是答案。计算的时候用逆元代替上面的分数即可

另外我补充一下边界情况:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; typedef long long LL; const int maxn = + ;
const LL MOD = ; LL fac[maxn], invfac[maxn], inv[maxn]; inline LL mul_mod(LL a, LL b) { return (a * b) % MOD; } LL pow_mod(LL a, LL n)
{
LL ans = , base = a;
while(n)
{
if(n & ) ans = mul_mod(ans, base);
base = mul_mod(base, base);
n >>= ;
}
return ans;
} LL inverse(LL a) { return pow_mod(a, MOD - ); } void preprocess()
{
fac[] = ;
for(int i = ; i < maxn; i++) { inv[i] = inverse(i); fac[i] = (fac[i - ] * i) % MOD; }
invfac[maxn - ] = inverse(fac[maxn - ]);
for(int i = maxn - ; i >= ; i--) invfac[i] = mul_mod(invfac[i+], (i+));
} vector<int> G[maxn]; int sz[maxn]; void dfs(int u, int fa)
{
sz[u] = ;
for(int i = ; i < G[u].size(); i++)
{
int v = G[u][i];
if(v == fa) continue;
dfs(v, u);
sz[u] += sz[v];
}
} LL d[maxn][maxn]; int main()
{
preprocess(); int T; scanf("%d", &T);
for(int kase = ; kase <= T; kase++)
{
int n, k; scanf("%d%d", &n, &k);
for(int i = ; i <= n; i++) G[i].clear();
for(int u, v, i = ; i < n; i++)
{
scanf("%d%d", &u, &v);
G[u].push_back(v); G[v].push_back(u);
} dfs(, );
d[][] = mul_mod(sz[] - , inv[sz[]]);
d[][] = inv[sz[]];
for(int i = ; i <= n; i++)
{
d[i][] = mul_mod(mul_mod(d[i-][], sz[i] - ), inv[sz[i]]);
for(int j = ; j <= min(i, k); j++)
{
LL t1 = mul_mod(mul_mod(d[i-][j], sz[i] - ), inv[sz[i]]);
LL t2 = mul_mod(d[i-][j-], inv[sz[i]]);
d[i][j] = t1 + t2;
if(d[i][j] >= MOD) d[i][j] -= MOD;
}
} LL ans = mul_mod(d[n][k], fac[n]);
printf("Case #%d: %I64d\n", kase, ans);
} return ;
}

代码君

HDU 5378 树上的概率DP Leader in Tree Land的更多相关文章

  1. 2015 Multi-University Training Contest 7 hdu 5378 Leader in Tree Land

    Leader in Tree Land Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  2. [2015hdu多校联赛补题]hdu5378 Leader in Tree Land

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:给你一棵n个结点的有根树.因为是有根树,那么每个结点可以指定以它为根的子树(后面讨论的子树 ...

  3. 2015多校第7场 HDU 5378 Leader in Tree Land 概率DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:一棵n个节点的树.对其节点进行标号(1~n).求恰好存在k个节点的标号是其节点所在子树的最 ...

  4. HDU 4089 Activation(概率DP)(转)

    11年北京现场赛的题目.概率DP. 公式化简起来比较困难....而且就算结果做出来了,没有考虑特殊情况照样会WA到死的.... 去参加区域赛一定要考虑到各种情况.   像概率dp,公式推出来就很容易写 ...

  5. HDU 4405 Aeroplane chess (概率DP)

    题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i  这个位置到达 n ...

  6. HDU - 5001 Walk(概率dp+记忆化搜索)

    Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...

  7. [概率dp] hdu 5378 Leader in Tree Land

    题意: 给你一颗以1位根节点的树.我们定义对于每一个子树,节点权值最大的权值记为这个子树的权值,为你将1~n放到这个树里 满足最大权值仅仅有k个的组合数是多少. 思路: 我们能够知道以每一个节点为子树 ...

  8. HDU 2955 Robberies 背包概率DP

    A - Robberies Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  9. HDU 4576 Robot (概率DP)

    暴力DP求解太卡时间了...........写挫一点就跪了 //hdu robot #include <cstdio> #include <iostream> #include ...

随机推荐

  1. 微信小程序tabBar显示问题

    在微信小程序的开发中,我遇到疑惑如下: 在app.json中定义了多个pages,一般微信小程序启动的时候,自动加载pages下的第一个页面, "pages": [        ...

  2. .net程序员业余Android开发赚点外快(介绍一下自己的经验)

    记得是11年10月份开始研究android的,当时还不会java,听说android比较火,自己也买了个垃圾android机,平时工作也不是特别忙,于是我就突发奇想,想试试做一下android应用可不 ...

  3. Mybatis 使用注解和Provider类实现动态条件查询

    1.注解内拼写 Mybatis SQL 脚本 @Repository public interface CustomerFeedMapper extends BaseCrudMapper<Cus ...

  4. canvas背景效果

    canvas背景效果: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  5. Java抽象类、接口和内部类

    1.抽象方法.抽象类 1)抽象方法: 由abstract修饰 只有方法的定义,没有方法的具体实现(连{}都没有) 由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体实现,用一个 ...

  6. 洛谷 P1426 小鱼会有危险吗

    题目描述 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是 ...

  7. 读书笔记2013-2 Linux内核设计与实现A

    读书笔记2013-2 Linux内核设计与实现A <Linux内核设计与实现> 简介 这本书不是想Linux源码剖析那样一行行分析Linux源代码的书,而是从Linux历史,Linux哲学 ...

  8. UVA 12325 Zombie'sTreasureChest 宝箱 (分类枚举)

    看上去非常像背包的问题,但是体积太大了. 线性规划的知识,枚举附近点就行了,优先选性价比高的, 宝物有两种体积为S0,价值V0,体积S1,价值V1. 枚举分以下几种: 1:枚举拿宝物1的数量,然后尽量 ...

  9. HTML之基本语法(段落标签、标题标签、空格标签、换行标签、图片标签和图片的基本属性)

    一.HTML标签 所谓的HTML的标签就是发明者认为定义好的一些单词,就相当于我们汉语中的字 二.HTML的语法 语法就是用来定义这些“字”应该如何解析或者书写的规则 三.常见标签及基本语法 1.人为 ...

  10. Python封装补充

    property属性 property实际是setter getter deleter是集合体,并不是一个单独的方法 import math # 使用的库 class Circle: def __in ...