[国家集训队] Crash 的文明世界
不错的树形$ DP$的题
可为什么我自带大常数啊$ cry$
链接:here
题意:给定一棵$ n$个节点的树,边权为$ 1$,对于每个点$ x$求$ \sum\limits_{i=1}^n dist(x,i)^k$
数据范围:$ n<=50000,k<=150$
$ Solution$
直接推式子
上下$ DP$先考虑子树内的贡献
有$ in(x)^k=\sum\limits (in(son[x])+1)^k$
这是因为自己子树内的每个点到自己的距离都$ ++$
再考虑子树外的贡献
有$ out(x)^k=(out(fa[x])+1)^k+(in(fa[x])+1)^k-(in(x)+2)^k$
这是因为父亲节点子树外的节点和父亲子树中除自己外其他子树内的节点到自己的距离相比原先都$ ++$
而自己这棵子树内不增反减所以再$ -=2$
直接二项式展开是$ nk^2$的
不过这类式子可以转化成斯特林数
我们只要从求$ in(x)^k/out(x)^k$转化成求$ C_{in(x)/out(x)}^k$即可
这样$ C_{in(x)}^k=\sum\limits C_{in(son[x])+1}^k=\sum\limits C_{in(son[x])}^k+C_{in(son[x])}^{k-1}$
求$ out$的时候同理,唯一的区别是$ C_{in(x)+2}^k$需要展开两层
代码还是比较清真的
$ my \ code$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define p 10007
#define M 100010
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt;
int val[][],out[][],fa[];
int F[M],L[M],N[M],a[M];
void add(int x,int y){
a[++k]=y;
if(!F[x])F[x]=k;
else N[L[x]]=k;
L[x]=k;
}
void dfs(int x,int pre){
fa[x]=pre;val[x][]=;
for(rt i=F[x];i;i=N[i])if(a[i]!=pre){
dfs(a[i],x);
(val[x][]+=val[a[i]][])%=p;
}
out[x][]=n-val[x][];
}
void get(int x){
for(rt i=F[x];i;i=N[i])if(a[i]!=fa[x]){
get(a[i]);
for(rt j=;j<=m;j++)
(val[x][j]+=val[a[i]][j]+val[a[i]][j-])%=p;
}
}
int S[][],inv[];
void up(int x){
for(rt j=;j<=m;j++)
if(x==)out[x][j]=;
else out[x][j]=(out[fa[x]][j]+out[fa[x]][j-]+val[fa[x]][j]+val[fa[x]][j-]-(val[x][j-]*+val[x][j]+val[x][j-]))%p;
for(rt i=F[x];i;i=N[i])if(a[i]!=fa[x])up(a[i]);
}
int main(){
n=read();m=read();
for(rt i=;i<n;i++){
x=read();y=read();
add(x,y);
add(y,x);
}
dfs(,);get();up();
for(rt i=;i<=n;i++)
for(rt j=;j<=m;j++)val[i][j]+=out[i][j];
S[][]=;
for(rt i=;i<=m;i++)
for(rt j=;j<=i;j++)
S[i][j]=(S[i-][j-]+j*S[i-][j])%p;
inv[]=inv[]=;
for(rt i=;i<=m+;i++)inv[i]=inv[p%i]*(p-p/i)%p;
for(rt i=;i<=n;i++){
ll ans=,C=,jc=;
for(rt j=;j<=m;j++){
(ans+=val[i][j]*S[m][j]*jc)%=p;
jc=jc*(j+)%p;
}
writeln((ans+p)%p);
}
return ;
}
[国家集训队] Crash 的文明世界的更多相关文章
- [国家集训队] Crash 的文明世界(第二类斯特林数)
题目 [国家集训队] Crash 的文明世界 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 \[\begin{aligned} ans_x&=\sum\limi ...
- [国家集训队] Crash的文明世界
Description 给定一棵 \(n\) 个点的树,对于每个点 \(i\) 求 \(S(i)=\sum\limits_{j=1}^n \operatorname{dist(i,j)}^k\) .\ ...
- 洛谷P4827 [国家集训队] Crash 的文明世界 [斯特林数,组合数,DP]
传送门 思路 又见到这个\(k\)次方啦!按照套路,我们将它搞成斯特林数: \[ ans_x=\sum_{i=0}^k i!S(k,i)\sum_y {dis(x,y) \choose i} \] 前 ...
- P4827 [国家集训队] Crash 的文明世界
传送门:洛谷 题目大意:设$$S(i)=\sum_{j=1}^ndis(i,j)^k$$,求$S(1),S(2),\ldots,S(n)$. 数据范围:$n\leq 50000,k\leq 150$ ...
- 解题:国家集训队 Crash 的文明世界
题面 这种套着高次幂的统计问题一般都要用到第二类斯特林数和自然数幂的关系:$a^k=\sum\limits_{i=0}^{k}S_k^iC_a^i*i!$ 那么对于每个点$x$有: $ans_x=\s ...
- 【[国家集训队] Crash 的文明世界】
先写一个五十分的思路吧 首先这道题有一个弱化版 [POI2008]STA-Station 相当于\(k=1\),于是就是一个非常简单的树形\(dp\)的\(up\ \ and\ \ down\)思想 ...
- P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)
传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...
- 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)
题意 题目链接:https://www.luogu.org/problem/P4827 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...
- 洛谷 P4827 [国家集训队] Crash 的文明世界
题目描述 给你一棵 n 个点的树,对于树上的每个节点 i,求 \(\sum_{j=1}^ndis(i,j)^k\).其中 \(dis(i,j)\) 为两点在树上的距离. 输入格式 第一行两个整 ...
随机推荐
- java 红黑树
背景:总结面试中关于红黑树的相关题目 红黑树(一)之 原理和算法详细介绍 漫画:什么是红黑树? 红黑树是一种自平衡的二叉查找树 红黑树的5个特征:根.叶子都是黑的 节点非红即黑.不能是连续红的.节点到 ...
- 【洛谷P1164 小A点菜】
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...
- 物联网温度服务器-ECharts、HTML5、JavaScript / ECharts gauge使用示例
https://blog.csdn.net/u012812482/article/details/51079890 1. 效果 2. 简介 1. 其中仪表的部分使用的是ECharts的gauge控件实 ...
- 函数后面的const修饰符的作用
比如 void Fun() const; 的const是修饰什么的? 其实是修饰this指向的对象的. 这篇文章很详细的说明了const的作用,其中第三点说明了这种const的作用:const的用法, ...
- tomcat部署-手动启动tomcat部署,添加网页,
公司的内网什么都不能往外传,于是自己用公司的网络搭了一个网页,在网上抄了一堆upload,用来来回传输数据.... 但是每次用ideaJ启动服务器太费时. 研究了一下怎么手动启动tomcat,部署网页 ...
- (贪心)nyoj448-寻找最大数
题目描述: 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入描述: 第一行输入一个正整数T,表示 ...
- python自动化开发-[第十五天]-jquery
今日概要 1.javascript补充 2.jquery 1.javascript-DOM绑定事件 1.事件类型 onclick 当用户点击某个对象时调用的事件句柄. ondblclick 当用户双击 ...
- mybatis无mapper.xml用法
在datasource配置类上加上 @MapperScan("cn.x.x.dao")@Configuration <project xmlns="http://m ...
- 2017-12-15python全栈9期第二天第七节之练习题
#!/user/bin/python# -*- coding:utf-8 -*-print(6 or 2 > 1)print(3 or 2 >1 )print(0 or 5 <4)p ...
- git中tag的使用
1.获取tags $ git tag 2.新建tag 有记录信息 $git tag -a releases-1.0.1 -m 'add i.sh file.' 没有记录信息 $git tag ...