洛谷 P4827 [国家集训队] Crash 的文明世界
题目描述
给你一棵 n 个点的树,对于树上的每个节点 i,求 \(\sum_{j=1}^ndis(i,j)^k\)。其中 \(dis(i,j)\) 为两点在树上的距离。
输入格式
第一行两个整数 n,k。
接下来 n-1 行,每行两个整数 (x,y),表示一条树边。
输出格式
一行一个整数,表示答案对 10007 取模的值。
样例输入
5 2
1 2
1 3
2 4
2 5
样例输出
10
7
23
18
18
数据范围
对于 \(30\%\) 的数据,\(n\le5000,k\le50\)
对于另 \(20\%\) 的数据,保证树是一条链
对于所有数据,\(n\le50000,k\le150\)
解析
题目要求的值即为\(\sum_{i=1}^{n}dis(x,i)^k\)。形式上可以用第二类斯特林数的性质进行化简。
Ans &= \sum_{i=1}^{n}dis(x,i)^k \\
&= \sum_{i=1}^{n} \sum_{j=0}^{k} S(k,j)*j!*C_{dis(x,i)}^{j}\\
&= \sum_{j=0}^{k}S(k,j)*j!*\sum_{i=1}^{n}(C_{dis(x,i)-1}^{j}+C_{dis(x,i)-1}^{j-1})\\
\end{align}
\]
其中斯特林数和阶乘都是可以预处理的。接下来的问题是如何求\(\sum_{i=1}^{n}C_{dis(x,i)}^{j}\)。
设\(f[i][j]\)表示对于第i个点的子树中上式的值,则\(C_{dis(x,i)-1}^{j}\)的值可以看做是在i点儿子的f中并由儿子推出\(f[i][j]\)的值。那么我们可以先假设1号点为根节点,用一遍dfs求出f的值,状态转移方程为
\]
然后用换根DP求出以任意i点作为根节点时的\(f[i][j]\)即可。最后的答案为
\]
动态规划时注意边界条件。
代码
#include <iostream>
#include <cstdio>
#define N 50002
#define K 201
#define int long long
using namespace std;
const int mod=10007;
int head[N],ver[N*2],nxt[N*2],l;
int n,k,i,j,f1[N][K],f2[N][K],g[K],f[K],s[K][K];
void insert(int x,int y)
{
l++;
ver[l]=y;
nxt[l]=head[x];
head[x]=l;
}
void dfs1(int x,int pre)
{
f1[x][0]=1;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(y!=pre){
dfs1(y,x);
for(int j=1;j<=k;j++) f1[x][j]=(f1[x][j]+f1[y][j]+f1[y][j-1])%mod;
f1[x][0]=(f1[x][0]+f1[y][0])%mod;
}
}
}
void dfs2(int x,int pre)
{
for(int i=0;i<=k;i++) f2[x][i]=f1[x][i];
if(pre){
for(int i=1;i<=k;i++) g[i]=(f2[pre][i]-f1[x][i]+mod-f1[x][i-1]+mod)%mod;
g[0]=(f2[pre][0]-f1[x][0]+mod)%mod;
for(int i=1;i<=k;i++) f2[x][i]=(f2[x][i]+g[i]+g[i-1])%mod;
f2[x][0]=(f2[x][0]+g[0])%mod;
}
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(y!=pre) dfs2(y,x);
}
}
signed main()
{
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
cin>>n>>k;
for(i=1;i<n;i++){
int u,v;
cin>>u>>v;
insert(u,v);
insert(v,u);
}
s[0][0]=s[1][1]=1;
f[0]=1;
for(i=1;i<=k;i++){
for(j=1;j<=k;j++) s[i][j]=(s[i-1][j-1]+j*s[i-1][j])%mod;
}
for(i=1;i<=k;i++) f[i]=f[i-1]*i%mod;
dfs1(1,0);
dfs2(1,0);
for(i=1;i<=n;i++){
int ans=0;
for(j=0;j<=k;j++) ans=(ans+(s[k][j]*f[j]%mod*f2[i][j])%mod)%mod;
cout<<ans<<endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
洛谷 P4827 [国家集训队] Crash 的文明世界的更多相关文章
- 洛谷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$ ...
- P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)
传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...
- [国家集训队] Crash 的文明世界(第二类斯特林数)
题目 [国家集训队] Crash 的文明世界 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 \[\begin{aligned} ans_x&=\sum\limi ...
- 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告
[国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...
- 洛谷P1829 [国家集训队]Crash的数字表格
题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整数.例如,LCM(6, ...
- 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
题目背景 提示:原 P1829 半数集问题 已经迁移至 P1028 数的计算 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a ...
- 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
传送门 式子好麻烦orz……大佬好腻害orz->这里 //minamoto #include<iostream> #include<cstdio> #define ll ...
- 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
题意:求$\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$. 开始开心(自闭)化简: $\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$ =$\su ...
随机推荐
- linux gsensor驱动分析【转】
本文转载自:http://blog.sina.com.cn/s/blog_89f592f501013sr2.html 本文以Bma250驱动为例子,详细介绍Gsensor设计的一个模板. gsenso ...
- 九、MySQL报错( (1292, u"Truncated incorrect DOUBLE value: '424a000000066'") result = self._query(query))
1.数据库sql语句:SELECT seat_id FROM netsale_order_seat os join netsale_order nor on os.order_code=nor.ord ...
- Oracle数据备份与恢复
为了保证数据库的高可用性,Oracle数据库提供了备份和恢复机制,以便在数据库发生故障时完成对数据库的恢复操作,避免损失重要的数据资源 丢失数据分为:物理丢失:操作系统的数据库主键(数据文件.控机文件 ...
- 关于 token
用户在浏览器做一系列操作,后台服务怎么判断这些操作是来自同一个用户? 1. seesion 用户登录后,后台生成 sessionid 返回给浏览器,浏览器的每次请求带上 sessionid,后台关联 ...
- KVM 虚拟化架构和实现原理
目录 目录 KVM虚拟化架构 devkvm QEMU OpenstackKVMQEMU 的关系 KVM的虚拟化实现 KVM虚拟化架构 KVM是嵌入在Linux操作系统标准内核中的一个虚拟化模块,它能够 ...
- pthon之mock应用
研发过程中常见分工合作开发接口,但互相之间接口有依赖,这时候便可以使用mock 目录 1.安装 2.使用mock调试自己写的方法 3.使用mock解除依赖关系 1.安装 由于我的是python2.7, ...
- glibc升级,解决glib版本过低的问题
Debian wheezy下的glibc版本为2.13,安装几个软件都运行不了,报以下类似错误:xxxx: /lib/i386-linux-gnu/i686/cmov/libc.so.6: versi ...
- tips for using shortcuts
tips for using shortcuts for mac: command+ctrl+F:full screen(当前应用全屏之后有一个好处 就是 使用 4 tap 的手势 可以在全屏的界面之 ...
- jQuery源码分析系列——来自Aaron
jQuery源码分析系列——来自Aaron 转载地址:http://www.cnblogs.com/aaronjs/p/3279314.html 版本截止到2013.8.24 jQuery官方发布最新 ...
- instanceof和getClass的区别
instanceof对比getClass: instanceof 比较的是继承关系或者实现关系的类类型,子类对象或者实现类对象放在前面:而getClass得到的是确切的类型,并不考虑继承,它判断的是引 ...