HDU 5378 Leader in Tree Land

可以用求概率的思想来解决这个问题。令以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!乘上概率就是答案。计算的时候用逆元代替上面的分数即可。

Leader in Tree Land

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 68    Accepted Submission(s): 26

Problem Description

Tree land has n cities,
connected by n?1 roads.
You can go to any city from any city. In other words, this land is a tree. The city numbered one is the root of this tree.

There are n ministers
numbered from 1 to n.
You will send them to n cities,
one city with one minister.

Since this is a rooted tree, each city is a root of a subtree and there are n subtrees.
The leader of a subtree is the minister with maximal number in this subtree. As you can see, one minister can be the leader of several subtrees.

One day all the leaders attend a meet, you find that there are exactly k ministers.
You want to know how many ways to send n ministers
to each city so that there are kministers
attend the meet.

Give your answer mod 1000000007.

Input

Multiple test cases. In the first line there is an integer T,
indicating the number of test cases. For each test case, first line contains two numbers n,k.
Next n?1 line
describe the roads of tree land.

T=10,1≤n≤1000,1≤k≤n

Output

For each test case, output one line. The output format is Case #x: ans, x is
the case number,starting from 1.

Sample Input

2
3 2
1 2
1 3
10 8
2 1
3 2
4 1
5 3
6 1
7 3
8 7
9 7
10 6

Sample Output

Case #1: 4
Case #2: 316512

Source

2015 Multi-University Training Contest 7

#include <bits/stdc++.h>
using namespace std;
#define prt(k) cerr<<#k" = "<<k<<endl
typedef long long ll;
const ll inf = 0x3f3f3f3f;
const ll mod = 1e9+7;
const ll N = 1005;
int sz[N];
vector<int> g[N];
ll dp[N][N];
int  n, K;
ll fac[N];
ll pmod(ll a, ll n)
{
    ll r  = 1;
    for (; n>0; n>>=1, a=a*a%mod) {
        if (n & 1) r = r * a % mod;
    }
    return r;
}
inline ll inv(ll a)
{
    return pmod(a, mod - 2);
}
void dfs(int u, int fa)
{
    sz[u] = 1;
    for (int v: g[u]) if (v-fa) {
        dfs(v, u);
        sz[u] += sz[v];
    }
}
ll in[N];
int main()
{
    fac[0] = 1; in[1] = 1;
    for (ll i=1;i<N;i++) fac[i]=fac[i-1]*i%mod, in[i]=inv(i);
    int re; scanf("%d", &re); int ca= 1;
    while (re--) {
        memset(sz,0 , sizeof sz);
        scanf("%d%d", &n ,&K);
        for(ll i=0;i<=n;i++) g[i].clear();
        memset(dp, 0, sizeof dp);
        for (ll i=0;i<n-1;i++) {
            int u, v;
            scanf("%d%d", &u, &v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
        dfs(1, 1);
        dp[0][0] = 1;
        for (int i=1;i<=n;i++)
        for (int j=0;j<=K;j++) {
            dp[i][j] = dp[i-1][j] * (sz[i] - 1) %mod
            * in[sz[i]] % mod;
            if (j > 0)
                dp[i][j] += dp[i-1][j-1] * in[sz[i]] % mod;
            dp[i][j] %= mod;
        }
        ll ans = dp[n][K] * fac[n] % mod;
        printf("Case #%d: %I64d\n", ca++, ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 13:43:16

HDU 5378 Leader in Tree Land的相关文章

hdu 5378 Leader in Tree Land(dp+逆元)

题目链接:hdu 5378 Leader in Tree Land 问题可以理解成N个节点的树,有K个ministers的概率,最后乘上N!.每个节点为ministers的概率即为1 / son(以该节点为根节点的子树包含的节点个数),同样不为ministers的概率为(son-1)/son.所以没有必要考虑树的结构,直接根句子节点的个数转移dp[i][j] dp[i][j] = dp[i-1][j-1] * 1 / son[u] dp[i][j] = dp[i-1][j] * (son[u]-

HDU 5378 Leader in Tree Land(2015 多校第7场 dp)

Leader in Tree Land Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 150    Accepted Submission(s): 54 Problem Description Tree land has  cities, connected by  roads. You can go to any city from

HDU 5378 Leader in Tree Land 树形背包

链接 题解来源:点击打开链接 题意: 给定n k 下面n-1行给出一棵树. 把数字1-n填到树的节点上. 填完后计算leader节点个数,若这个点是leader,则这个点上填的数>这个点的子树上填的数 问:恰好有k个leader节点的 填涂方案数. 思路: dp[i][j]表示以i点为根的子树 有恰好j个leader的方案数. 如果u 是叶子节点则 dp[u][0] = 0, dp[u][1] = 1; 如果u不是叶子节点: 先不考虑u点能否成为leader,背包一下. 然后考虑u点:若u能成为

[概率dp] hdu 5378 Leader in Tree Land

题意: 给你一颗以1位根节点的树,我们定义对于每个子树,节点权值最大的权值记为这个子树的权值,为你将1~n放到这个树里 满足最大权值只有k个的组合数是多少. 思路: 我们可以知道以每个节点为子树,且根节点权值最大的概率是多少,不是的概率是多少. 那么其实问题就变成了 我们在n个物品里面,每个物品拿的概率是pi不拿的概率是1-pi 问你拿k个物品的概率是多少 然后最后乘n!就好了.中间计算运用逆元. 代码: #include"cstdlib" #include"cstring&

HDOJ 5378 Leader in Tree Land 概率DP

方法太屌,只能看一看了..... 可以用求概率的思想来解决这个问题.令以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].这样

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:给你一棵n个结点的有根树.因为是有根树,那么每个结点可以指定以它为根的子树(后面讨论的子树都是这个).现在我们把标号从1到n的n个minister派驻到这些结点上面(每个结点派驻一人),并规定任一子树中编号最大的minister 为该子树的领导,问你存在多少个不同的领导 解: 引用官方题解: 可以用求概率的思想来解决这个问题.令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]

J. Leader in Tree Land

#include <iostream> using namespace std; int cas,t = 1,road[1001][1001],n,k,ra,rb,size[1001]; long long sum,dp[1001][1001]; //dp[i][j]表示从1到i节点有j个节点是其字数的最大值 void init() { int i,j; sum = 1; for(i = 1;i <= n;i ++) { sum = (sum*i)%1000000007; size[i]

HDU 4896 Minimal Spanning Tree(矩阵快速幂)

题意: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一个循环,接下来的9个点连回去的边都是一样的.预处理出5个点的所有连通状态,总共只有52种,然后对于新增加一个点和前面点的连边状态可以处理出所有状态的转移.然后转移矩阵可以处理出来了,快速幂一下就可以了,对于普通的矩阵乘法是sigma( a(i, k) * b(k, j) ) (1<=k<=N), 现在

hdu 4603 Color the Tree 2013多校1-4

这道题细节真的很多 首先可以想到a和b的最优策略一定是沿着a和b在树上的链走,走到某个点停止,然后再依次占领和这个点邻接的边 所以,解决这道题的步骤如下: 预处理阶段: step 1:取任意一个点为根节点,找出父子关系并且对这个树进行dp,求出从某个节点出发往下所包含的所有边的权值总和  复杂度O(n) step 2:从tree dp 的结果中计算对于某个节点,从某条边出发所包含的边的综合,并且对其从大到小进行排序 复杂度O(n*logn) step 3:dfs求出这颗树的欧拉回路,以及每个点的