[国家集训队] Crash 的文明世界(第二类斯特林数)
题目
前置
斯特林数\(\Longrightarrow\)斯特林数及反演总结
做法
ans_x&=\sum\limits_{i=1}^ndis(i,x)^k\\
&=\sum\limits_{i=1}^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}C_{dis(i,x)}^jj!\\
&=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum\limits_{i=1}^nC_{dis(i,x)}^j\\
&=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum\limits_{i=1}^n(C_{dis(i,x)-1}^j+C_{dis(i,x)-1}^{j-1})
\end{aligned}\]
\(f[x][j]\)表示\(x\)子树内,关于\(x\):\(C_{dis(i,x)}^j\)的答案
显然有\(f[x][j]=\sum\limits_{son}f[son][j]+f[son][j-1]\)
当这仅仅对于根有效,所以再做一遍换根\(dp\)
Code
#include<bits/stdc++.h>
typedef int LL;
const LL maxn=5e4+9,mod=10007,maxm=209;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}
return x*f;
}
struct node{
LL to,nxt;
}dis[maxn<<1];
LL n,num,K;
LL head[maxn],dp1[maxn][maxm],dp2[maxn][maxm],strl[maxm][maxm],tmp[maxm],fac[maxm];
inline void Add(LL u,LL v){
dis[++num]=(node){v,head[u]}; head[u]=num;
}
void Dfs1(LL u,LL f){
dp1[u][0]=1;
for(LL i=head[u];i;i=dis[i].nxt){
LL v(dis[i].to);
if(v==f) continue;
Dfs1(v,u);
for(LL j=1;j<=K;++j) dp1[u][j]=(dp1[u][j]+dp1[v][j]+dp1[v][j-1])%mod;
dp1[u][0]=(dp1[u][0]+dp1[v][0])%mod;
}
}
void Dfs2(LL u,LL f){
for(LL i=0;i<=K;++i) dp2[u][i]=dp1[u][i];
if(f){
for(LL i=1;i<=K;++i) tmp[i]=(dp2[f][i]-dp1[u][i]+mod-dp1[u][i-1]+mod)%mod;
tmp[0]=(dp2[f][0]-dp1[u][0]+mod)%mod;
for(LL i=1;i<=K;++i) dp2[u][i]=(dp2[u][i]+tmp[i]+tmp[i-1])%mod;
dp2[u][0]=(dp2[u][0]+tmp[0])%mod;
}
for(LL i=head[u];i;i=dis[i].nxt){
LL v(dis[i].to);
if(v==f) continue;
Dfs2(v,u);
}
}
int main(){
n=Read(); K=Read();
strl[0][0]=strl[1][1]=1;
for(LL i=2;i<=K;++i)
for(LL j=1;j<=i;++j)
strl[i][j]=(strl[i-1][j-1]+j*strl[i-1][j])%mod;
fac[0]=fac[1]=1;
for(LL i=2;i<=K;++i) fac[i]=fac[i-1]*i%mod;
for(LL i=1;i<n;++i){
LL u(Read()),v(Read());
Add(u,v); Add(v,u);
}
Dfs1(1,0); Dfs2(1,0);
for(LL i=1;i<=n;++i){
LL ret(0);
for(LL j=0;j<=K;++j) ret=(ret+1ll*strl[K][j]*fac[j]*dp2[i][j])%mod;
printf("%d\n",ret);
}
return 0;
}
[国家集训队] Crash 的文明世界(第二类斯特林数)的更多相关文章
- BZOJ 2159: Crash 的文明世界 第二类斯特林数+树形dp
这个题非常巧妙啊~ #include <bits/stdc++.h> #define M 170 #define N 50003 #define mod 10007 #define LL ...
- 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\) ,求出 \( ...
- 解题:国家集训队 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 的文明世界
题目描述 给你一棵 n 个点的树,对于树上的每个节点 i,求 \(\sum_{j=1}^ndis(i,j)^k\).其中 \(dis(i,j)\) 为两点在树上的距离. 输入格式 第一行两个整 ...
- [题解] LuoguP4827 [国家集训队] Crash 的文明世界
传送门 这个题......我谔谔 首先可以考虑换根\(dp\),但到后来发现二项式定理展开过后需要维护\(k\)个值,同时每个值也要\(O(k)\)的时间按二项式定理算 当然fft优化过后就是k lo ...
- [国家集训队] Crash 的文明世界
不错的树形$ DP$的题 可为什么我自带大常数啊$ cry$ 链接:here 题意:给定一棵$ n$个节点的树,边权为$ 1$,对于每个点$ x$求$ \sum\limits_{i=1}^n dist ...
- [国家集训队] Crash的文明世界
Description 给定一棵 \(n\) 个点的树,对于每个点 \(i\) 求 \(S(i)=\sum\limits_{j=1}^n \operatorname{dist(i,j)}^k\) .\ ...
随机推荐
- 开启GitHub模式,now!
(原文地址为:http://www.karottc.com/blog/2014/06/15/current-doing/) 最近看到了一篇文章,该文章的作者将自己连续177天在github上commi ...
- bootstrap基础学习十一篇
bootstrap下拉菜单(Dropdowns) 下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.如需使用下列菜单,只需要在 class .dropdown 内加上下拉菜单即可. a.代码示例如 ...
- MathType与Origin是怎么兼容的
MathType作为一款常用的公式编辑器,可以与很多的软件兼容使用.Origin虽然是一款专业绘图与数据分析软件,但是在使用过程中也是可以用到MathType.它可以帮助Origin给图表加上标签,或 ...
- 用MathType编辑异或与非符号有什么方法
在数学中我们会遇到各种数学符号,有运算符号,希腊符号,还有表示逻辑关系的逻辑符号等,这些大多都是比较常用的符号.其中逻辑符号中我们经常会用到异或与非等,这些符号的编辑我们常常会需要用MathType这 ...
- WHERE字句
structured query language(非过程性的结构查询语言) 主要内容: 数据库怎么限制里面的数据: 数据库怎么排列里面的数据. WHERE子句: --WHERE字句起到的是对数据库查 ...
- Android中的<include>标签和<merge>标签
android开发中经常会碰到某一个布局的复用:直接拷贝粘贴并不是是有效的策略,这时候就能够借助<include>标签和<merge>标签来完毕. 官方文档: http://d ...
- AVA 8 :从永久区(PermGen)到元空间(Metaspace)
你注意到了吗?JDK 8早期可访问版本已经提供下载了,java 开发人员可以使用java 8 提供的新的语言和运行特性来做一些实验.其中一个特性就是完全的移除永久代(Permanent Generat ...
- 【BZOJ3144】[Hnoi2013]切糕 最小割
[BZOJ3144][Hnoi2013]切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q ...
- 《从零开始学Swift》学习笔记(Day 56)——命名规范Swift编码规范之命名规范
原创文章,欢迎转载.转载请注明:关东升的博客 程序代码中到处都是自己定义的名字,取一个有样并且符合规范的名字非常重要. 命名方法很多,但是比较有名的,广泛接受命名法有: 匈牙利命名,一般只是命名变量, ...
- css3动画效果:2 简易动画
1. transition动画:鼠标移上去 旋转放大 关键点-- :hover \ transform: scale(*) rotate(*deg) cards 2.关键帧动画: 位移动画 t ...