解题:国家集训队 Crash 的文明世界
这种套着高次幂的统计问题一般都要用到第二类斯特林数和自然数幂的关系:$a^k=\sum\limits_{i=0}^{k}S_k^iC_a^i*i!$
那么对于每个点$x$有:
$ans_x=\sum\limits_{i=0}^k S_{k}^i C_{\sum dis(x,j)}^i i!$
问题变成求$C_{\sum dis(x,j)}^i$,神仙告诉我们,这个东西要DP求
为什么要DP求?先往下看
那么就设$dp[i][k]$表示以i为根的子树里$C_{\sum dis(i,j)}^k$的值,$pd[i][k]$表示以$i$为根的子树外......的值
$dp$数组是符合我们常做的树形DP的思路的,先看这个
转移当然是从儿子合并啦:
$dp[i][k]=C_{\sum dis(i,j)}^k$
$=C_{\sum dis(son,j)+1}^k+[k==0]$
好,现在回答为什么要DP?因为根据组合数的性质$C_n^m=C_{n-1}^m+C_{n-1}^{m-1}$,这里可以直接转移
$=C_{\sum dis(son,j)}^k+C_{\sum dis(son,j)}^{k-1}+[k==0]$
$=dp[son][k]+dp[son][k-1]+[k==0]$
这样一来就可以从父亲往下转移求$pd$了,下面用$C'$表示从父亲转移过来时的组合数(区别于子树)
$dp[i][k]={C'}_{\sum dis(i,j)}^k$
$={C'}_{\sum dis(fth,j)+1}^k+C_{\sum dis(fth,j)+1}^k-C_{\sum dis(i,j)+1}^k$
爆拆一通得到:
$=pd[fth][k]+pd[fth][k-1]+dp[fth][k]+dp[fth][k-1]-dp[i][k]-2*dp[i][k-1]-dp[i][k-2]$
于是做完了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,mod=;
int n,k,t1,t2,cnt;
int fac[N],inv[N],st2[M][M];
int p[N],noww[*N],goal[*N];
long long dp[N][M],pd[N][M];
void Add(long long &x,int y)
{
x+=y;
if(x>=mod) x-=mod;
}
int C(int n,int m)
{
return n<m?:1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int Qpow(int x,int k)
{
if(k==) return x;
int tmp=Qpow(x,k/);
return k%?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod;
}
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
noww[++cnt]=p[t];
goal[cnt]=f,p[t]=cnt;
}
void Pre()
{
fac[]=inv[]=,st2[][]=;
for(int i=;i<=k;i++)
for(int j=;j<=k;j++)
st2[i][j]=(st2[i-][j-]+1ll*st2[i-][j]*j%mod)%mod;
for(int i=;i<=k;i++)
fac[i]=1ll*fac[i-]*i%mod;
inv[k]=Qpow(fac[k],mod-);
for(int i=k-;i;i--)
inv[i]=1ll*inv[i+]*(i+)%mod;
}
void Gettre(int nde,int fth)
{
dp[nde][]=;
for(int i=p[nde],g;i;i=noww[i])
if(goal[i]!=fth)
{
Gettre(g=goal[i],nde);
Add(dp[nde][],dp[g][]);
for(int j=;j<=k;j++)
Add(dp[nde][j],(dp[g][j]+dp[g][j-])%mod);
}
}
void Getanc(int nde,int fth)
{
if(nde!=)
{
for(int i=;i<=k;i++)
{
pd[nde][i]=pd[fth][i]+dp[fth][i]-dp[nde][i];
if(i>=) pd[nde][i]+=pd[fth][i-]+dp[fth][i-]-*dp[nde][i-];
if(i>=) pd[nde][i]-=dp[nde][i-]; pd[nde][i]=(pd[nde][i]%mod+mod)%mod;
}
}
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth) Getanc(goal[i],nde);
}
int main()
{
scanf("%d%d",&n,&k),Pre();
for(int i=;i<n;i++)
scanf("%d%d",&t1,&t2),Link(t1,t2);
Gettre(,),Getanc(,);
for(int i=;i<=n;i++)
{
long long ans=;
for(int j=;j<=k;j++)
Add(ans,1ll*st2[k][j]*fac[j]%mod*(dp[i][j]+pd[i][j])%mod);
printf("%lld\n",ans);
}
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\) .\ ...
- [国家集训队] Crash 的文明世界
不错的树形$ DP$的题 可为什么我自带大常数啊$ cry$ 链接:here 题意:给定一棵$ n$个节点的树,边权为$ 1$,对于每个点$ x$求$ \sum\limits_{i=1}^n dist ...
- 洛谷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 的文明世界】
先写一个五十分的思路吧 首先这道题有一个弱化版 [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)\) 为两点在树上的距离. 输入格式 第一行两个整 ...
随机推荐
- 微服务RPC框架选美
原文:http://p.primeton.com/articles/59030eeda6f2a40690f03629 1.RPC 框架谁最美? Hello,everybody!说到RPC框架,可能大家 ...
- LintCode——合并排序数组II
描述:合并两个排序的整数数组A和B变成一个新的数组 样例:给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 1.Python:先将数组B加到数组A之后,然后 ...
- 《Pro SQL Server Internals, 2nd edition》的CHAPTER 3 Statistics中的Introduction to SQL Server Statistics、Statistics and Execution Plans、Statistics Maintenance(译)
<Pro SQL Server Internals> 作者: Dmitri Korotkevitch 出版社: Apress出版年: 2016-12-29页数: 804定价: USD 59 ...
- [T-ARA][O My God]
歌词来源:http://music.163.com/#/song?id=22704432 눈을 뜨면 생각이나고 길을 걷다 생각이나고 [nu-neul ddeu-myeon saeng-ga-gi ...
- Arcengine效率探究之一——属性的读取(转载)
http://blog.csdn.net/lk103852503/article/details/6566652 在写一个对属性表的统计函数时,发现执行速度奇慢无比,百思不得其解,其实算法并不复杂,后 ...
- [沈航软工教学] 学生项目Coding地址汇总
同学们把自己的coding主页链接贴在评论里,要求格式"班号+学号+coding主页链接",如: "1301+13061193 + https://coding.net/ ...
- 12.16daily_scrum
这个阶段,我们组需要攻克的技术难题一个是测试及美化界面,另一个是在M1阶段的基础上进一步细化和完善悬浮窗的功能,具体的工作内容如下: 具体工作: 小组成员 今日任务 明日任务 工作时间 李睿琦 图片笔 ...
- 20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
第八周 进程的切换和系统的一般执行过程 一.进程切换关键代码switch_to 1.不同类型进程有不同调度需求--两种分类 2.调度策略--规则 Linux中进程优先级是动态的,周期性调整. 3.时机 ...
- Answer My Questions
回答自己的问题,真棒!断电让自己的工作重来.真棒! 阅读以前自己的博客,发现问题都已经有了答案. (1).想要成为一名专业的软件工程师,首先得是有相关的资格证书,这个可以通过软考获得.然后在职场中锻炼 ...
- 我们的团队-IT梦想队
IT梦想队 队长:李遇塘 队员:王长.周兴荣.朱岭杰.马婧婧 团队宣言: 一匹狼战斗力低,但一群狼的我们无所畏惧!李遇塘http://www.cnblogs.com/Liyutang/ 王 长htt ...