【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)
【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)
题面
题解
看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\),因此需要换别的方法。
注意到自然指数幂和第二林斯特林数之间的关系:
\]
那么将答案式化简
Ans_x&=\sum_{i=1}^N dis(i,x)^K\\
&=\sum_{i=1}^N \sum_{j=0}^K \begin{Bmatrix}K\\j\end{Bmatrix}{dis(x,i)\choose j}j!\\
&=\sum_{j=0}^K\begin{Bmatrix}K\\j\end{Bmatrix}j!\sum_{i=1}^N {dis(x,i)\choose j}
\end{aligned}\]
那么对于每一个点\(x\),要求的只有\(\displaystyle \sum_{i=1}^N {dis(x,i)\choose j}\)
我们知道组合数杨辉三角上的转移\(\displaystyle {n\choose m}={n-1\choose m}+{n-1\choose m-1}\)
那么带进去,可以得到:$$\sum_{i=1}^N {dis(x,i)\choose j}=\sum_{i=1}^N {dis(x,i)-1\choose j}+\sum_{i=1}^N {dis(x,i)-1\choose j-1}$$
考虑怎么\(dp\),设\(f[i][j]\)表示\(i\)子树内的\({dis\choose j}\)的和。
考虑节点\(u\)和其儿子\(v\)。显然\(v\)的子树到\(u\)的距离是到\(v\)的距离\(-1\)。
所以可以得到转移\(\displaystyle f[u][j]=\sum_{v}(f[v][j]+f[v][j-1])\)。
因为需要换根\(dp\),所以再额外考虑清楚如何减去一个子树的贡献,这里懒得写了。
那么只需要换根\(dp\)做完之后求出所有节点的\(f\),再预处理第二类斯特林数直接算答案即可。
BZOJ数据有点奇怪,用注释的部分读入
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define MOD 10007
#define MAX 50500
#define MAXK 155
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int S[MAXK][MAXK],jc[MAXK];
int f[MAX][MAXK],g[MAX][MAXK],tmp[MAXK];
int n,K;
void dfs(int u,int ff)
{
f[u][0]=1;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs(v,u);
for(int j=0;j<=K;++j)f[u][j]=(f[u][j]+f[v][j])%MOD;
for(int j=1;j<=K;++j)f[u][j]=(f[u][j]+f[v][j-1])%MOD;
}
}
void DFS(int u,int ff)
{
for(int j=0;j<=K;++j)g[u][j]=f[u][j];
if(ff)
{
for(int j=0;j<=K;++j)tmp[j]=g[ff][j];
for(int j=0;j<=K;++j)tmp[j]=(tmp[j]+MOD-f[u][j])%MOD;
for(int j=1;j<=K;++j)tmp[j]=(tmp[j]+MOD-f[u][j-1])%MOD;
for(int j=0;j<=K;++j)g[u][j]=(g[u][j]+tmp[j])%MOD;
for(int j=1;j<=K;++j)g[u][j]=(g[u][j]+tmp[j-1])%MOD;
}
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=ff)DFS(e[i].v,u);
}
int main()
{
/*
int L,now,A,B,Q;
scanf("%d%d%d%d%d%d%d",&n,&K,&L,&now,&A,&B,&Q);
for(int i=1;i<n;i++)
{
now=(now*A+B)%Q;
int tmp=i<L?i:L;
int x=i-now%tmp,y=i+1;
Add(x,y);
}
*/
n=read();K=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
S[0][0]=jc[0]=1;
for(int i=1;i<=K;++i)jc[i]=jc[i-1]*i%MOD;
for(int i=1;i<=K;++i)
for(int j=1;j<=i;++j)
S[i][j]=(S[i-1][j-1]+j*S[i-1][j])%MOD;
dfs(1,0);DFS(1,0);
for(int i=1;i<=n;++i)
{
int ans=0;
for(int j=0;j<=K;++j)
ans=(ans+1ll*S[K][j]*jc[j]*g[i][j])%MOD;
printf("%d\n",ans);
}
return 0;
}
【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)的更多相关文章
- [国家集训队] Crash 的文明世界(第二类斯特林数)
题目 [国家集训队] Crash 的文明世界 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 \[\begin{aligned} ans_x&=\sum\limi ...
- BZOJ 2159: Crash 的文明世界 第二类斯特林数+树形dp
这个题非常巧妙啊~ #include <bits/stdc++.h> #define M 170 #define N 50003 #define mod 10007 #define LL ...
- bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...
- 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\) ,求出 \( ...
- BZOJ 2159: Crash 的文明世界(组合数学+第二类斯特林数+树形dp)
传送门 解题思路 比较有意思的一道数学题.首先\(n*k^2\)的做法比较好想,就是维护一个\(x^i\)这种东西,然后转移的时候用二项式定理拆开转移.然后有一个比较有意思的结论就是把求\(x^i\) ...
- BZOJ2159 Crash的文明世界——树上DP&&第二类Stirling数
题意 给定一个有 $n$ 个结点的树,设 $S(i)$ 为第 $i$ 个结点的“指标值”,定义为 $S(i)=\sum_{i=1}^{n}dist(i,j)^k$,$dist(i, j)$ 为结点 $ ...
- 题解 [BZOJ2159] Crash的文明世界
题面 解析 这题一眼换根DP啊 首先,我们考虑一下如何转换\(n^m\)这个式子, 先把式子摆出来吧:\(n^m=\sum_{j=0}^mS(m,j)C_n^jj!\) 其中\(S(m,j)\)表示第 ...
- 【BZOJ5093】图的价值(第二类斯特林数,组合数学,NTT)
[BZOJ5093]图的价值(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 单独考虑每一个点的贡献: 因为不知道它连了几条边,所以枚举一下 \[\sum_{i=0}^{n-1}C_{n-1 ...
随机推荐
- Luogu P2048 [NOI2010]超级钢琴
这道题题号很清新啊!第一次开NOI的题,因为最近考到了这道题的升级版. 我们先考虑\(O(n^2)\)大暴力,就是枚举前后端点然后开一个前缀和减一下即可. 然后引入正解,我们设一个三元组\(F(s,l ...
- springboot @Value 获取计算机中绝对路径文件的内容
默认情况下使用 @Value("aaa.txt") private Resource txtResource; 这样获取到的是项目classpath 下的 aaa.txt 如果想获 ...
- 分布式监控系统Zabbix-3.0.3-完整安装记录(1)
分布式监控系统Zabbix-3.0.3的安装记录 环境说明zabbix-server:192.168.1.30 #zabbix的服务端(若要监控本机,则需要配置本机的Zabbix agent, ...
- 集美大学1414-团队作业2:需求分析&原型设计分数发布
1.评分标准 检查项 分数 编号 调研文档或截图 1 1 软件需求分析说明书 2 2 NABCD 2 3 描述每个成员具体分工 1 4 原型设计 2 5 编码规范 1 6 推广视频 1 7 ...
- Doors Breaking and Repairing CodeForces - 1102C (思维)
You are policeman and you are playing a game with Slavik. The game is turn-based and each turn consi ...
- JS对象复制(深拷贝、浅拷贝)
如何在 JS 中复制对象 在本文中,我们将从浅拷贝(shallow copy)和深拷贝(deep copy)两个方面,介绍多种 JS 中复制对象的方法. 在开始之前,有一些基础知识值得一提:Javas ...
- JQuery基础-- Ajax
基本格式: get: $.get("url",data,function(res){ #..... }) post: $.post("url",data ...
- PAT 1049 数列的片段和
https://pintia.cn/problem-sets/994805260223102976/problems/994805275792359424 给定一个正数数列,我们可以从中截取任意的连续 ...
- Weblogic 9.2和10.3 改密码 一站完成
Weblogic 9.2和10.3可通用,只需修改参照如下配置即可: SET BEA_HOME=F:\beaSET JRE_HOME=%BEA_HOME%\jdk150_04\binSET LIB_H ...
- 转载: 一、linux cpu、内存、IO、网络的测试工具
来源地址: http://blog.csdn.net/wenwenxiong/article/details/77197997 记录一下 以后好找.. 一.linux cpu.内存.IO.网络的测试工 ...