HDU4625 JZPTREE——第二类斯特林数
复杂度大概O(nk)
一些尝试:
1.对每个点推出1,2,3,,,到k次方的值。但是临项递推二项式展开也要考虑到具体每个点的dist
2.相邻k次方递推呢?递推还是不能避免k次方的展开
k次方比较讨厌,于是考虑用斯特林数处理
转化成求k个后面这个C(dis,i)
组合数相比较于k次方有什么好处呢?
有直接的简单的递推式!
并且恰好的是,可以直接树形dp,距离对于子树恰好-1
O(nk)树形dp一遍
然后换根O(nk)再处理一遍
回到主函数,把之前的那些东西在分别乘上加起来即可。
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
const int K=;
const int mod=;
int n,k,t;
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
int f[N][K];
int g[N][K];
int jie[K],s[K][K];
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
void dfs(int x,int fa){
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
dfs(y,x);
for(reg j=;j<=k;++j){
if(j)f[x][j]=(f[x][j]+f[y][j]+f[y][j-])%mod;
else f[x][j]=(f[x][j]+f[y][j])%mod;
}
}
f[x][]=(f[x][]+)%mod;
}
void sol(int x,int fa){
if(x==){
for(reg j=;j<=k;++j) g[x][j]=f[x][j];
}
else{
for(reg j=;j<=k;++j){
if(j>) g[x][j]=(f[x][j]+(g[fa][j]-(f[x][j]+f[x][j-])+mod)%mod+(g[fa][j-]-(f[x][j-]+f[x][j-]))%mod+mod+mod)%mod;
else if(j==) g[x][j]=(f[x][j]+(g[fa][j]-(f[x][j]+f[x][j-])+mod)%mod+(g[fa][j-]-(f[x][j-]))%mod+mod+mod)%mod;
else g[x][j]=n;
}
}
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
sol(y,x);
}
}
void clear(){
cnt=;
memset(hd,,sizeof hd);
memset(f,,sizeof f);
memset(g,,sizeof g);
}
int main(){
rd(t);
s[][]=;
for(reg i=;i<=;++i){
for(reg j=;j<=;++j){
s[i][j]=(s[i-][j-]+j*(s[i-][j])%mod)%mod;
}
}
jie[]=;
for(reg i=;i<=;++i) jie[i]=jie[i-]*i%mod;
while(t--){
clear();
rd(n);rd(k);
int x,y;
for(reg i=;i<n;++i){
rd(x);rd(y);
add(x,y);add(y,x);
}
dfs(,);
// for(reg i=1;i<=n;++i){
// cout<<" ii "<<i<<endl;
// for(reg j=0;j<=k;++j){
// cout<<" f[i]["<<j<<"]"<<" : "<<f[i][j]<<endl;
// }cout<<endl;
// }cout<<endl;
sol(,);
// for(reg i=1;i<=n;++i){
// cout<<" ii "<<i<<endl;
// for(reg j=0;j<=k;++j){
// cout<<" g[i]["<<j<<"]"<<" : "<<g[i][j]<<endl;
// }cout<<endl;
// }cout<<endl; for(reg i=;i<=n;++i){
int ans=;
for(reg j=;j<=k;++j){
ans=(ans+jie[j]*s[k][j]%mod*g[i][j]%mod)%mod;
}
printf("%d\n",ans);
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2018/12/29 19:09:56
*/
总结:
这个就真的比较有趣了
把n^k换成斯特林数,还有一个原因是n^k实在不好支持递推
组合数就比较轻松了。
恰好树形dp的递推特点和组合数的递推式又比较好的吻合在一起!
(当然,n的i次下降幂也有不错的递推性质,也可以不用转化成组合数直接类比递推,本质相同。)
HDU4625 JZPTREE——第二类斯特林数的更多相关文章
- bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...
- bzoj 2159 Crash 的文明世界 & hdu 4625 JZPTREE —— 第二类斯特林数+树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 使用公式:\( n^{k} = \sum\limits_{i=0}^{k} S(k,i ...
- HDU - 4625 JZPTREE(第二类斯特林数+树DP)
https://vjudge.net/problem/HDU-4625 题意 给出一颗树,边权为1,对于每个结点u,求sigma(dist(u,v)^k). 分析 贴个官方题解 n^k并不好转移,于是 ...
- 【BZOJ5093】图的价值(第二类斯特林数,组合数学,NTT)
[BZOJ5093]图的价值(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 单独考虑每一个点的贡献: 因为不知道它连了几条边,所以枚举一下 \[\sum_{i=0}^{n-1}C_{n-1 ...
- 【BZOJ4555】求和(第二类斯特林数,组合数学,NTT)
[BZOJ4555]求和(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 推推柿子 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)·j!·2^j\] \[=\sum_{i= ...
- CF932E Team Work(第二类斯特林数)
传送门:CF原网 洛谷 题意:给定 $n,k$,求 $\sum\limits^n_{i=1}\dbinom{n}{i}i^k\bmod(10^9+7)$. $1\le n\le 10^9,1\le k ...
- 【CF961G】Partitions 第二类斯特林数
[CF961G]Partitions 题意:给出n个物品,每个物品有一个权值$w_i$,定义一个集合$S$的权值为$W(S)=|S|\sum\limits_{x\in S} w_x$,定义一个划分的权 ...
- 【CF932E】Team Work(第二类斯特林数)
[CF932E]Team Work(第二类斯特林数) 题面 洛谷 CF 求\(\sum_{i=1}^nC_{n}^i*i^k\) 题解 寒假的时候被带飞,这题被带着写了一遍.事实上并不难,我们来颓柿子 ...
- 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)
[51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...
随机推荐
- SVN部署与简单使用
原文发表于cu:2016-05-24 参考文档: http://www.tuicool.com/articles/Yv2iyu7 http://www.centoscn.com/CentosServe ...
- 53. [LeetCode] Maximum Subarray
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- AndroidStudio引入AAR依赖
title: AndroidStudio引入AAR依赖 date: 2016-08-10 00:25:57 tags: [aar] categories: [Tool,Gradle] --- 概述 本 ...
- sql主表分页查询关联子表取任意一条高效方案
有个业务场景,主表中一条数据,在子表中有多条详情数据.对数据进行展示的时候,产品希望随意拿一条子表的数据关联展示出来,用了很多方案,但是都不够好. sql查询取子表任意一条,多个字段的方案 最终找到一 ...
- equals()和hashcode()详解
转载自http://www.cnblogs.com/Qian123/p/5703507.html java.lang.Object类中有两个非常重要的方法: public boolean equa ...
- Struts2:Struts2在jsp中使用标签时值的获取
在OGNL的使用中,需要访问一系列的对象,这些对象放在OGNL的context中,context是一个Map结构,实际上它和ActionContext是相应的. 当用户发送请求时,struts会创建A ...
- MySQL 基于mysqldump备份工具实战演练
前言: 细节提示:先执行 show global variables like 'log_bin';看看log_bin的值,如果服务器变量log_bin的值为OFF,需要修改my.cnf配置文件,将l ...
- PHP Mailer 发送邮件
<?php /* 下载网址 https://github.com/PHPMailer/PHPMailer 打开下载的压缩包文件目录 将 PHPMailer-master 下的 src 文件夹复制 ...
- HostsConfig文件修改器
Hosts文件修改器 HostsConfig v1.1 免费版 最近工作需要,经常需要更换各种域名的内外网配置,频繁的修改HOSTS文件,很多的时间都用在的修改HOSTS文件上,工作效率大大降低,课余 ...
- JS在当前页面插入<script>标签,并执行
将<script>标签绑定到<html>上, html可换成body,header等其他存在的标签. var htmm =document.getElementsByTagNa ...