【51nod1677】treecnt(树上数学题)
大致题意: 给你一个节点从\(1\sim n\)编号的树,让你从中选择\(k\)个节点并通过选择的边联通,且要使选择的边数最少,让你计算对于所有选择\(k\)个节点的情况最小选择边数的总和。
题解
这道题乍一看很麻烦:最短路径?最小生成树?\(LCA\)?通通都不用!!!
其实,这道题就是一道很简单的数学题。

如上图所示,对于某一条边\(w\),假设它的一边共有\(t\)个节点,则显然它的另一边共有\(n-t\)个节点。
对于一条边的贡献,我们可以这样理解:在多少种情况下,这条边的两边都有被选入\(k\)个点中的点,此时这个点就必须被选。
而对于这些点的分布,有以下三种情况:
①这条边的两边都有点被选,这种情况的可能性就是我们要求的,但是难以直接计算。
②所有被选中的点都在这条边的左面,由于这条边的左边共有\(t\)个点,因此这种情况的可能性为\(C_t^k\)。
③所有被选中的点都在这条边的右面,由于这条边的右边共有\(n-t\)个点,因此这种情况的可能性为\(C_{n-t}^k\)。
由于总情况数为\(C_n^k\),所以,这条边的两边都有点被选的可能性就是\(C_n^k\) - \(C_t^k\) - \(C_{n-t}^k\)。
既然这样,我们可以直接枚举每一条边,计算出答案并累加即可。
代码
#include<bits/stdc++.h>
#define LL long long
#define N 100000
#define MOD 1000000007
using namespace std;
int n,k,ee=0,lnk[N+5],vis[N+5]={0};
struct edge
{
int to,nxt,val;
}e[2*N+5];
LL ans=0,fac[N+5]={0},inv[N+5]={0};
inline char tc()
{
static char ff[100000],*A=ff,*B=ff;
return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0;int f=1;char ch;
while(!isdigit(ch=tc())) if(ch=='-') f=-1;
while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
x*=f;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void add(int x,int y)
{
e[++ee]=(edge){y,lnk[x],0},lnk[x]=ee;
}
inline LL quick_pow(LL x,LL y)//快速幂
{
LL res=1;
while(y)
{
if(y&1) (res*=x)%=MOD;
(x*=x)%=MOD,y>>=1;
}
return res;
}
inline void Init()//初始化
{
register int i;fac[1]=1;
for(i=2;i<=N+4;++i) fac[i]=(fac[i-1]*i)%MOD;//预处理阶乘
inv[N+4]=quick_pow(fac[N+4],MOD-2);
for(i=N+3;i>=0;--i) inv[i]=(inv[i+1]*(i+1))%MOD;//预处理逆元
}
inline LL C(LL x,LL y)//组合数
{
if(x<y) return 0;
if(!y) return 1;
return fac[x]*inv[y]%MOD*inv[x-y]%MOD;
}
inline int dfs(int x)
{
register int i;LL res=1;vis[x]=1;
for(i=lnk[x];i;i=e[i].nxt)
{
if(!vis[e[i].to])
{
LL t=dfs(e[i].to);
(ans+=C(n,k)%MOD-C(t,k)%MOD-C(n-t,k)%MOD+MOD)%=MOD;//核心计算公式
res+=t;
}
}
return res;//res表示该边某一侧的点数
}
int main()
{
register int i;int x,y;
for(read(n),read(k),i=1;i<n;++i)
read(x),read(y),add(x,y),add(y,x);
Init(),dfs(1);
return write((ans+MOD)%MOD),0;
}
【51nod1677】treecnt(树上数学题)的更多相关文章
- 【计数】51nod1677 treecnt
要将答案看做是小问题的贡献和 Description 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少. 现需要计算对于所有选择k ...
- 【树形背包】bzoj4033: [HAOI2015]树上染色
仔细思考后会发现和51nod1677 treecnt有异曲同工之妙 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...
- NOIP2018 - 暑期博客整理
暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的 ...
- [洛谷U40581]树上统计treecnt
[洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...
- 树上统计treecnt(dsu on tree 并查集 正难则反)
题目链接 dalao们怎么都写的线段树合并啊.. dsu跑的好慢. \(Description\) 给定一棵\(n(n\leq 10^5)\)个点的树. 定义\(Tree[L,R]\)表示为了使得\( ...
- Luogu P3177 [HAOI2015]树上染色
一道有机结合了计数和贪心这一DP两大考点的神仙题,不得不说做法是很玄妙. 首先我们很容易想到DP,设\(f_{i,j}\)表示在以\(i\)为根节点的子树中选\(j\)个黑色节点的最大收益值. 然后我 ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- BZOJ 3784: 树上的路径
Description 问一棵树上前 \(k\) 大路径的边权. Sol 边分治. 非常感谢数据没有菊花图. 为了写写边分治试试然后就开了这道题. 边分治非常好想,选一条重边,分成两部分,然后分别求最 ...
- HDU 2376 树形dp|树上任意两点距离和的平均值
原题:http://acm.hdu.edu.cn/showproblem.php?pid=2376 经典问题,求的是树上任意两点和的平均值. 这里我们不能枚举点,这样n^2的复杂度.我们可以枚举每一条 ...
随机推荐
- 洛谷P1164 小A点菜(01背包求方案数)
P1164 小A点菜 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过u ...
- LaTeX使用心得
LaTeX是一个功能强大的,开源的排版工具. 最近教练让我们做课件,我做数论,鉴于LaTeX的数学公式功能强大(而MS办公软件的数学公式简直就是个LJ)和我的学习精神,我决定用LaTeX写课件. 在一 ...
- retrying模块的安装及使用
安装retrying模块: win10用户在联网的情况下直接在cmd.exe里面键入"pip install retrying" 即可安装retrying模板 在网页正常浏览的过 ...
- UDP可靠传输简易设计
UDP,鉴于其丢包和乱序(后发先至)问题,为保证其可靠性设计如下报头协议,供大家参考 数据包设计 数据包总大小按照MTU设计设置,小于1500字节 数据包示意图 包头类型说明 1.类型(1字节) 数值 ...
- JS如何在本地读取json等文件
JS使用ajax等在本地读取文件的时候,会报如下的错误: 解决方法一: npm install http-server -g 全局安装 http-server 下载完成之后再在目标文件中cmd中输入 ...
- POJ1047 Round and Round We Go
题目来源:http://poj.org/problem?id=1047 题目大意: 有一些整数具有这样的性质:它的位数为n,把它和1到n的任意一个整数相乘结果的数字会是原数字的一个“环”.说起来比较抽 ...
- js index of()用法
含义: indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置.(工作中常用) 提示和注释: 注释:indexOf() 方法对大小写敏感! 注释:如果要检索的字符串值没有出现,则该方 ...
- 03-----Bootstrap的介绍
一.Bootstrap的介绍 凡是使用过Bootstrap的开发者,都不在乎做这么两件事情:复制and粘贴.哈哈~,是的使用Bootstrap非常简单,但是在复制粘贴之前,需要先对Bootstrap的 ...
- postman将上一个请求的结果作为下一个请求的数据
需要在Tests中写入如下代码: var jsonData = JSON.parse(responseBody); postman.setGlobalVariable("token" ...
- ASP.NET Core模块化前后端分离快速开发框架介绍之4、模块化实现思路
源码 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin 前 ...