CF981H K Paths
CF981H K Paths
题解
一道不错的分治ntt题目
题目稍微转化一下,就是所有k条链的存在交,并且交的部分都被覆盖k次
所以一定是两个点,之间路径选择k次,然后端点两开花
f[x]表示x子树内往下延伸k条链(可以停在x)的方案数(有标号)
每个子树选择一个或者不选择,最多一共选择k个,dp是O(n^2)的,
考虑生成函数,其实就是:
而
统计答案?
直接两两点对f相乘肯定不行,因为f仅仅是子树
考虑枚举x作为lca统计
如果是拐弯的链,树形DP即可。
而如果是直上直下的链,
对于不同子树,x的选择是扣去这个子树,还可以往上选择
分治NTT的经典问题
const int N=1e5+5; int n,k; int jie[N],inv[N]; int A(int n,int m){if(n<0||m<0||n<m) return 0;return mul(jie[n],inv[n-m]); } int val[N],si[N]; void divi(int l,int r,Poly &f,Poly &g){// cout<<" divi "<<l<<" "<<r<<endl;if(l==r){g.resize(1);g[0]=val[l];f.resize(2);f[0]=1;f[1]=si[l];return;}Poly lf,lg,rf,rg;int mid=(l+r)>>1;divi(l,mid,lf,lg);divi(mid+1,r,rf,rg);f=lf*rf;g=(lf*rg)+(lg*rf); } int f[N],sum[N],son[N]; int ans,sz[N]; struct node{int nxt,to; }e[2*N]; int hd[N],cnt; void add(int x,int y){e[++cnt].nxt=hd[x];e[cnt].to=y;hd[x]=cnt; } void dfs(int x,int fa){// cout<<" xx "<<x<<" fa "<<fa<<endl;sz[x]=1;int pre=0;for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;if(y==fa) continue;++son[x];dfs(y,x);sz[x]+=sz[y];sum[x]=ad(sum[x],sum[y]);ans=ad(ans,mul(pre,sum[y]));pre=ad(pre,sum[y]);}if(son[x]){Poly F,G;int ct=0;for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;if(y==fa) continue;val[++ct]=sum[y];si[ct]=sz[y];}divi(1,ct,F,G);Poly T;T.resize(2);T[0]=1;T[1]=n-sz[x];G=G*T;for(reg i=0;i<=min(k,son[x]);++i){// cout<<"F["<<i<<"] "<<F[i]<<" G["<<i<<"] "<<G[i]<<endl;ans=ad(ans,mul(A(k,i),G[i]));f[x]=ad(f[x],mul(A(k,i),F[i]));}sum[x]=ad(sum[x],f[x]);}else{f[x]=1;sum[x]=1;}// cout<<" return "<<x<<" f "<<f[x]<<endl; } int main(){rd(n);rd(k);if(k==1){ans=(ll)n*(n-1)/2%mod;ot(ans);return 0;}jie[0]=1;for(reg i=1;i<=k;++i) jie[i]=mul(jie[i-1],i);inv[k]=qm(jie[k],mod-2);for(reg i=k-1;i>=0;--i) inv[i]=mul(inv[i+1],i+1);int x,y;for(reg i=1;i<n;++i){rd(x);rd(y);add(x,y);add(y,x);}dfs(1,0);ot(ans);return 0; }} signed main(){Miracle::main();return 0; }/*Author: *Miracle*Date: 2019/4/8 18:57:00 */
转载于:https://www.cnblogs.com/Miracevin/p/10988527.html
CF981H K Paths相关推荐
- 使用wrk进行性能测试
1 wrk介绍 wrk是一款现代化的HTTP性能测试工具,即使运行在单核CPU上也能产生显著的压力.它融合了一种多线程设计,并使用了一些可扩展事件通知机制,例如epoll and kqueue.一个可 ...
- 也谈贝叶斯分类(C#)版本
代码下载 最近在做一个大作业.搭建一个信息检索平台.用到了贝叶斯分类参考了洞庭散人大哥的技术博客 http://www.cnblogs.com/phinecos/archive/2008/10/21/ ...
- Decision Transformer环境安装
Official codebase for Decision Transformer: Reinforcement Learning via Sequence Modeling 参考了min-deci ...
- 【PAT数据结构与算法题目集】 旅游规划(单源最短路径,长度+路径查找)
[PAT数据结构与算法题目集] 旅游规划(单源最短路径,长度+路径查找) 题目 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客 ...
- cesium实现车辆转运模拟
一.使用cesium示例里面的模型 模型为glb格式 二.封装转运模拟工具类 /**** 转运模拟* date:2022-06-21* author:zdh* @type {TransferSimUt ...
- 【编译原理】【实验】利用子集法构造DFA
利用子集法构造DFA 一.实验目的 二.实验要求.内容 三.实验设备 四.实验原理(或程序框图)及步骤 五.程序源代码 六.实验数据.结果分析 七.存在的问题与体会 附录 一.实验目的 掌握将非确定有 ...
- java迪杰斯特拉算法实例,Java 图的最短路径dijstra(迪杰斯特拉)算法和拓扑排序
一.图的最短路径从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径 图的最短路径有许多重要的应用. 例如:上图中v0-v8有9个点,可以看做不同的地点,现在要规 ...
- 一起来学k8s 40. kubernetes api操作
kubernetes api操作 kubectl 通过访问 Kubernetes API 来执行命令.我们也可以通过对应的TLS key和token, 使用curl 或是 golang client做 ...
- 数据结构(java版)
一.绪论 1.数据结构概论 数据结构研究计算机的操作对象以及他们之间的关系和操作. 2.算法的定义.特征以及要求 算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转化为输出的计算 ...
最新文章
- DAY10-万物皆对象-2018-2-2
- 【转】数据库的乐观锁和悲观锁
- Hadoop Hive概念学习系列之hive里的HiveQL——查询语言(十五)
- shell脚本如何实现goto_linux通过shell脚本实现对apache服务的监控
- FortiGate 的相关知识
- 隐藏网页文件的后缀(IIS测试通过)!
- python两列数据相关性_使用.corr获取两列之间的相关性
- 接口与事件之图形界面的认证登录
- MySql存储过程的操作
- PowerDesign逆向生成数据表结构PDM文件
- matlab解二元二次方程组
- 计算机粘贴功能不能用了,电脑不能粘贴怎么回事_电脑不能粘贴了怎么解决
- android7.0root工具,KingRoot全球实现Android 7.0一键 Root
- Deepin双系统找不到Windows启动项
- AD软件画电路图笔记
- IOS 如何通过浏览器打开App
- 电脑蓝屏原因与手把手处理指南(关于0x00000124分析)
- android磁盘分区,Android SD卡做磁盘分区图文教程
- 汉寿计算机职业中专,汉寿县职业中等专业学校2021年招生简章
- 李秘书讲写作:这节课的标题起什么好?