﹡    LH (命题人)
 
基准时间限制:1 秒 空间限制:131072 KB 分值: 40

给定一棵n个节点的树,从1到n标号。选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少。

现需要计算对于所有选择k个点的情况最小选择边数的总和为多少。

样例解释:

一共有三种可能:(下列配图蓝色点表示选择的点,红色边表示最优方案中的边)

选择点{1,2}:至少要选择第一条边使得1和2联通。

 

选择点{1,3}:至少要选择第二条边使得1和3联通。

选择点{2,3}:两条边都要选择才能使2和3联通。

Input
  1. 第一行两个数nk(1<=k<=n<=100000)
  2. 接下来n-1行,每行两个数x,y描述一条边(1<=x,y<=n)
Output
  1. 一个数,答案对1,000,000,007取模。
Input示例
  1. 3 2
  2. 1 2
  3. 1 3
Output示例
  1. 4
    分析:对每条边算贡献即可;
       当这条边有贡献时,k个点必然分布在这条边分隔开的两部分中,这里考虑用组合数计算情况数。
       合法情况数=总情况数-不合法情况数。
       总情况数等于Cn,k),设其中一部分点数为x,另一部分则为n-x,不合法情况数等于Cx,k)+C(n-x,k)。
    代码:
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <climits>
  7. #include <cstring>
  8. #include <string>
  9. #include <set>
  10. #include <map>
  11. #include <unordered_map>
  12. #include <queue>
  13. #include <stack>
  14. #include <vector>
  15. #include <list>
  16. #define rep(i,m,n) for(i=m;i<=n;i++)
  17. #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
  18. #define mod 1000000007
  19. #define inf 0x3f3f3f3f
  20. #define vi vector<int>
  21. #define pb push_back
  22. #define mp make_pair
  23. #define fi first
  24. #define se second
  25. #define ll long long
  26. #define pi acos(-1.0)
  27. #define pii pair<int,int>
  28. #define Lson L, mid, ls[rt]
  29. #define Rson mid+1, R, rs[rt]
  30. #define sys system("pause")
  31. #define intxt freopen("in.txt","r",stdin)
  32. const int maxn=1e5+;
  33. using namespace std;
  34. int gcd(int p,int q){return q==?p:gcd(q,p%q);}
  35. ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p%mod;p=p*p%mod;q>>=;}return f;}
  36. inline ll read()
  37. {
  38. ll x=;int f=;char ch=getchar();
  39. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  40. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  41. return x*f;
  42. }
  43. int n,m,k,t,son[maxn];
  44. ll fac[maxn],c[maxn],ans;
  45. vi e[maxn];
  46. void dfs(int now,int pre)
  47. {
  48. son[now]=;
  49. for(int x:e[now])
  50. {
  51. if(x==pre)continue;
  52. dfs(x,now);
  53. son[now]+=son[x];
  54. }
  55. ans+=c[n]-c[son[now]]-c[n-son[now]];
  56. ans=(ans+*mod)%mod;
  57. }
  58. void init()
  59. {
  60. fac[]=;
  61. for(int i=;i<=maxn-;i++)fac[i]=fac[i-]*i%mod;
  62. for(int i=m;i<=maxn-;i++)c[i]=fac[i]*qpow(fac[i-m],mod-)%mod*qpow(fac[m],mod-)%mod;
  63. }
  64. int main()
  65. {
  66. int i,j;
  67. scanf("%d%d",&n,&m);
  68. rep(i,,n-)scanf("%d%d",&j,&k),e[j].pb(k),e[k].pb(j);
  69. init();
  70. dfs(,);
  71. printf("%lld\n",ans);
  72. //system("Pause");
  73. return ;
  74. }

treecnt的更多相关文章

  1. 树上统计treecnt(dsu on tree 并查集 正难则反)

    题目链接 dalao们怎么都写的线段树合并啊.. dsu跑的好慢. \(Description\) 给定一棵\(n(n\leq 10^5)\)个点的树. 定义\(Tree[L,R]\)表示为了使得\( ...

  2. [洛谷U40581]树上统计treecnt

    [洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...

  3. 1677 treecnt(贡献)

    1677 treecnt 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联 ...

  4. treecnt 算法马拉松20(告别美国大选及卡斯特罗)

    treecnt 基准时间限制:1 秒 空间限制:131072 KB 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少. 现需要计算 ...

  5. 51nod_1677:treecnt

    题目是求一棵n节点树中对于C(n,k)颗子树,每棵子树为在n个节点中选不同的k个节点作为树的边界点,这样的所有子树共包含多少条边. 问题可以转化一下,对每一条边,不同的子树中可能包含可能不包含这条边, ...

  6. 51Nod 1677 treecnt

    一道比较基础的计数题,还是一个常用的单独计算贡献的例子. 首先看题目和范围,暴力枚举肯定是不可行的,而且\(O(n\ logn)\)的算法貌似很难写. 那我们就来想\(O(n)\)的吧,我们单独考虑每 ...

  7. 51nod 1677 treecnt(思维)

    题意: 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少. 现需要计算对于所有选择k个点的情况最小选择边数的总和为多少. 考虑每条 ...

  8. 【51nod1677】treecnt(树上数学题)

    点此看题面 大致题意: 给你一个节点从1~n编号的树,让你从中选择k个节点并通过选择的边联通,且要使选择的边数最少,让你计算对于所有选择k个节点的情况最小选择边数的总和. 题解 这道题乍一看很麻烦:最 ...

  9. 【计数】51nod1677 treecnt

    要将答案看做是小问题的贡献和 Description 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少. 现需要计算对于所有选择k ...

随机推荐

  1. 浙大pat1020题解

    1020. Tree Traversals (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...

  2. 关于PHP的一小段代码求解如下求解"%2\$s"

    <?php$format = "The %2\$s contains %1\$d monkeys";printf($format, 8, "北京");?& ...

  3. linux重要目录说明

    1 home :root用户的home 目录是root,普通用户的home 目录是/home,users/(不要随便使用root权限,小白容易改错东西哒) 2 bin:常用可执行文件:/bin./us ...

  4. CustomSummaryCalculate 用法

    private void gridView1_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs ...

  5. jquery选择器之基本筛选选择

    1.基本选择器 2.内容筛选选择器 3.可见性筛选选择器 4.属性筛选选择器 5.子元素筛选选择器 6.表单元素选择器 7.表单对象属性筛选器

  6. Python os.path模板函数

    os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...

  7. android 实现透明状态栏

    主要使用https://github.com/jgilfelt/SystemBarTint这个开源库 1 ,导入SystemBarTintManager类 2 ,BaseFragmentActivit ...

  8. 关于 HSSF 和 XSSF 功能的开发者入门指南 (Apache POI 操作 Excel)

    关于 HSSF 和 XSSF 功能的开发者入门指南 笔者深夜无眠,特此对本文翻译一部分,未完成部分待后续更新 本文源文地址 意欲使用 HSSF 和 XSSF 功能快熟读写电子表格?那本文就是为你而写的 ...

  9. 简单的 Android 拍照并显示以及获取路径后上传

    简单的 Android 拍照并显示以及获取路径后上传 Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap ...

  10. 你我公益模式系统APP开发

    你我公益模式系统APP开发(微or电 158.1500.1390 小凡团队)你我公益系统开发,你我公益系统模式定制,你我公益系统开发软件,你我公益平台系统开发. 互联网世界无边无界,互联网创业者应敢于 ...