某考试 T2 Tree
2 树
2.1 题目描述
给一棵n 个节点的树,节点分别编号为0 到n - 1。
你可以通过如下的操作来修改这棵树:首先先删去树上的一条边,此时树
会分裂为两个连通块,然后在两个连通块之间加上一条新的边使得它们变成一
棵新的树。
问有多少棵n 个节点的树可以通过对原树进行不超过k 次这样的操作来
得到,答案对109 + 7 取模。如果有一条边(u; v) 出现在了树A 中且不在树B
中,我们就认为树A 和树B 是不同的。
2.2 输入格式
第一行为两个整数n; k。
接下来一行用n - 1 个整数a1; a2; a3; :::; an-1 描述给定的树。其中ai 表
示节点i 和节点ai 之间有一条边,保证ai < i。
2.3 输出格式
输出一个整数表示答案对109 + 7 取模后的值。
2.4 输入样例一
3 1
0 0
2.5 输出样例一
3
2.6 输入样例二
6 4
0 1 1 3 3
2.7 输出样例二
1196
2.8 输入样例三
20 10
0 0 1 1 3 2 3 0 1 7 5 9 4 0 6 15 14 10 15
2.9 输出样例三
540101309
2.10 数据范围与约定
对于100% 的数据,n<=80,k<n。
当时考试的时候先做的T1和T3然后就没时间做这个题了,,,
但是可能当时我有时间也做不出来吧23333.
正解是矩阵树定理+高斯消元/拉格朗日插值法。
因为最多只能选k条不是原来树上的边,所以我们可以把树边看成1,把非树边看成x。
最后的答案就是矩阵树定理消出的多项式的x^k及之前的项的系数和。
这个当然可以暴力多项式乘法(因为多项式的项数不多但是有很多多项式要相乘,所以此时的NTT是没有暴力快的),
但是这样太慢了,大数据会挂。
我们还可以发现最后的多项式是一个n-1次多项式,所以我们可以带n对点来确定这个多项式。
这样的复杂度是 O(N^4) ,开开心心过本题。。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=87;
const int ha=1000000007;
int n,k,a[maxn][maxn];
int fa,b[maxn][maxn];
int c[maxn][maxn],ans; inline int add(int x,int y){
x+=y;
return x>=ha?x-ha:x;
} inline int ksm(int x,int y){
int an=1;
for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
return an;
} inline int matrix_tree(int x){
int an=1;
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
if(a[i][j]) b[i][j]=b[j][i]=ha-1,b[i][i]++,b[j][j]++;
else b[i][j]=b[j][i]=ha-x,b[i][i]+=x,b[j][j]+=x;
} for(int i=1;i<n;i++){
int tmp=i;
for(;tmp<n;tmp++) if(b[tmp][i]) break;
if(tmp>i){
an=ha-an;
for(int k=i;k<n;k++) swap(b[i][k],b[tmp][k]);
} for(int j=i+1;j<n;j++)
while(b[j][i]){
an=ha-an;
int A=b[i][i]/b[j][i];
for(int k=i;k<n;k++){
b[i][k]=((ll)b[i][k]-b[j][k]*(ll)A)%ha;
if(b[i][k]<0) b[i][k]+=ha;
swap(b[i][k],b[j][k]);
}
} an=an*(ll)b[i][i]%ha;
} return an;
} inline void xy(){
n++;
for(int i=1;i<n;i++){
if(!c[i][i]){
for(int j=i+1;j<n;j++) if(c[j][i]){
for(int k=i;k<=n;k++) swap(c[j][k],c[i][k]);
break;
}
} for(int j=i+1;j<n;j++)
while(c[j][i]){
int A=c[i][i]/c[j][i];
for(int k=i;k<=n;k++){
c[i][k]=((ll)c[i][k]-c[j][k]*(ll)A)%ha;
if(c[i][k]<0) c[i][k]+=ha;
swap(c[i][k],c[j][k]);
}
}
} for(int i=n-1;i;i--){
for(int j=n-1;j>i;j--) c[i][n]=add(c[i][n],add(ha,-c[j][n]*(ll)c[i][j]%ha));
c[i][n]=c[i][n]*(ll)ksm(c[i][i],ha-2)%ha;
}
} int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout); scanf("%d%d",&n,&k);
for(int i=2;i<=n;i++){
scanf("%d",&fa);
fa++,a[i][fa]++,a[fa][i]++;
} for(int i=1;i<=n;i++){
for(int j=1,u=1;j<=n;j++,u=u*(ll)i%ha) c[i][j]=u;
c[i][n+1]=matrix_tree(i);
} xy(); k++;
for(int i=1;i<=k;i++) ans=add(ans,c[i][n]); printf("%d\n",ans); return 0;
}
某考试 T2 Tree的更多相关文章
- 9.13 考试 T2 区间
删区间 题意: 给出一个长度为
- 2019.3.7考试T2 离线数论??
$ \color{#0066ff}{ 题目描述 }$ 一天,olinr 在 luogu.org 刷题,一点提交,等了一分钟之后,又蛙又替. olinr 发动了他的绝招,说:"为啥啊???&q ...
- 某考试T2 frog
题目背景 无 题目描述 数轴上有 n 只青蛙,分别编号为 1 到 n.青蛙 i 的初始位置的坐标为 xi. 它们准备进行如下形式的移动:每轮包括 m 次跳跃,第 i 次跳跃由青蛙 ai(1 < ...
- 某考试 T2 yja
2.1 Description 在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r1, r2, ..., rn. 最大化这 n 个点构成的凸包面积, 凸包上的点的顺序任意. 2.2 Inp ...
- 题解 2020.10.24 考试 T2 选数
题目传送门 题目大意 见题面. 思路 本来以为zcx.pxj变强了,后来发现是SPJ出问题了...考试的时候感觉有点人均啊...结果自己还是只想出来一半. 我们假设 \(f(x)=(\lfloor\f ...
- 某考试 T2 orzcyr
非常nice的一道行列式的题目. 考虑如果没有路径不相交这个限制的话,那么这个题就是一个行列式:设 a[i][j] 为从编号第i小的源点到编号第j小的汇点的路径条数,那么矩阵a[][]的行列式就是的答 ...
- 2019.2.26考试T2 矩阵快速幂加速DP
\(\color{#0066ff}{题解 }\) 可以发现, 数据范围中的n特别小,容易想到状压 可以想到类似于状压DP的思路,按列进行转移 那么应该有3维,\(f[i][j][k]\)代表到第i列, ...
- 2019.2.10考试T2, 多项式求exp+生成函数
\(\color{#0066ff}{ 题目描述 }\) 为了减小文件大小,这里不写一堆题目背景了. 请写一个程序,输入一个数字N,输出N个点的森林的数量.点有标号. 森林是一种无向图,要求图中不能存在 ...
- 某考试 T2 Seg
Seg [问题描述]数轴上有n条线段,第i条线段的左端点是a[i],右端点是b[i].Bob发现1~2n共2n个整数点,每个点都是某条线段的端点.这些线段有如下两类特点:1 x y,表示第x条线段和第 ...
随机推荐
- 友推在Android 实现微信等分享代码的常见问题
介绍,最近 做了一个项目,需要集成分享功能.果断选择 友推. 集成过程,参考友推官方提供的集成文档即可 废话不多说,主要说一下自己在集成过程中遇到的一些问题,主要有两个: 问题1. 引入youtui- ...
- 47.关于gradle的解疑
Short Answer Gradle is a build system. Long Answer Before Android Studio you were using Eclipse for ...
- iOS笔记052- Quartz2D-绘图
简介 Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘 ...
- IOS开发学习笔记015-block和protocol
一.block block 代码段 标识是 ^ block 和函数很像 1.可以保存代码 2.有返回值 3.有形参 格式 返回值 (block名)(形参列表) = ^(形参列表) {代码段 ...
- 用sqlmap跑post型注入
bugku-成绩单 题目地址 手工注入: ①看到题目,分别提交1,2,3,出现不同的成绩单,可见参数我们是可以控制,通过POST的方式. ②我们尝试输入1 and 1=1#和1 and 1=2#发现不 ...
- Mac OS X 上的Apache配置
Mac系统自带apache服务器 查看apache版本 sudo apachectl -v 启动apache sudo apachectl start 重启apache sudo apachectl ...
- Spring框架的AOP
Spring学习笔记(四) 本文目录 1 AOP的介绍 2 Spring的AspectJ实现AOP(annotation) 3 Spring的AspectJ实现AOP (XML) Spring文档ht ...
- jquery中attr和prop的区别介绍
在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...
- 软件包管理rpm_yum
和文本相关的命令cat 正向显示文本tac 反向显示文本more 可以一步一步显示文本文件less 还可以往上看.几个快捷键:j(往下看), k (往上看), g(定位最上), G(定位最下), ct ...
- Redis Cluster管理
author:JevonWei 版权声明:原创作品 Redis 3开始支持了Cluster模式,增强了Redis的水平扩展能力,Redis Cluster的节点分片通过hash slot实现,每个节点 ...