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;
}

  

转载于:https://www.cnblogs.com/JYYHH/p/8507389.html

某考试 T2 Tree相关推荐

  1. 备战Noip2018模拟赛5(B组)T2 Tree 采果子

    10月4日备战Noip2018模拟赛5(B组) T2 Tree采果子 题目描述 LYL大牛今天心情不错,于是走到埃及郊外旅游.他边走边向四周望望,发现周围有许多果树.这些树之间互相到达的时间LYL是知 ...

  2. 【2020模拟考试T2】【PAT乙】1032 挖掘机技术哪家强 (20分) 模拟,STL

    problem 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 10 ​5 ​​ 的正整数 ...

  3. bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)

    每个节点继承父节点的树,则答案为query(root[x]+root[y]-root[lca(x,y)]-root[fa[lca(x,y)]]) #include<iostream> #i ...

  4. 2022暑初二信息竞赛学习成果分享2

    学习目录2 第二期 (2022/07/17~2022/07/23) Day 7:复习&测试--**树状数组** `Morning`--树状数组复习测试 考试"游记" 题目总 ...

  5. JAVA API个各种方法

    熟练掌握常用类及方法 String str1.startsWith(str2) 判断str1是否以str2开头,返回true或false str1.endsWith(str2) 判断str1是否以st ...

  6. P1505 [国家集训队]旅游 树链剖分

    题目链接 题意:树上更新某一点权值,更新两点简单路径权值,查询最大,最小,和 思路:思路应该比较简单,就是树链剖分后用线段树维护区间最大最小以及区间和. 但是本题比较特殊的是给的边权,转化为点权即可. ...

  7. [bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划

    食物链 bzoj-4562 Haoi-2016 题目大意:给你n个点,m条边的DAG,求所有的满足条件的链,使得每条链的起点是一个入度为0的点,中点是一条出度为0的点. 注释:$1\le n\le 1 ...

  8. 省选前的计划(日更,然而你们天天吊打我)

    还有17天就省选了,不能再颓废了! 总结篇(不定期更新) 网络流基本 计算几何基本 字符串入门+基础 斜率优化dp 日记篇(日更) 3.18 今天做了一些题目吧. 考试的题目也做了一道题目. 方格取数 ...

  9. 《精通Python设计模式》学习结构型之享元模式

    这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import EnumTreeType = Enum('TreeTye' ...

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续8)
  2. oracle安装后怎么连接数据库,安装完odp后,连接oracle数据库
  3. 从宏观经济状况看目前股市
  4. Ubunt_配置_start
  5. 剑指offer23 从上往下打印二叉树
  6. 【学术相关】魔术乘法:张成奇教授40年磨一剑!
  7. Android编译笔记三
  8. Oracle 如何修改列的数据类型
  9. java 队列已满_java – ThreadPoolExecutor当队列已满时阻塞?
  10. ML.NET机器学习、API容器化与Azure DevOps实践(三):RESTful API
  11. feign获取outstream_Spring Cloud Feign接口返回流
  12. Haoop0.20.1+Ubuntu11.10+Eclipse3.5.2
  13. html图片下方会有一像素,div里嵌套了img底部会有白块问题和图片一像素问题解决 - Macchiato...
  14. HDU2108 Shape of HDU【多边形凹凸】
  15. 为什么不能生成accde_原来“转换生成语言学”就是这么回事
  16. HCIE-Security Day25:DSPN+NHRP+Mgre:实验(四)配置shortcut方式DSPN(OSPF路由协议)
  17. 堆排序(java实现)
  18. ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。
  19. gif动态图批量加水印方法
  20. 资料:高等数学学习笔记——高等数学(二)学习笔记汇总

热门文章

  1. linux 内核配置mmc,Linux内核编译,配置本机驱动
  2. Django项目与中间件与celery
  3. JMS学习(2):ActiveMQ简单介绍以及安装
  4. Java中的Properties类详解Properties配置文件
  5. vb获取textbox数字_Spectrum仪器PCIe数字化仪可额外扩展8个数字输入
  6. 哪款浏览器好用_碉堡了!火狐浏览器发布重大更新,谷歌Chrome请hold住!
  7. c库函数tmpfile
  8. idea中的markdown文档如何插入图片
  9. spark之CF协同过滤
  10. docker-compose初试及命令基础