【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)

题面

BZOJ

洛谷

题解

看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\),因此需要换别的方法。

注意到自然指数幂和第二林斯特林数之间的关系:

\[n^k=\sum_{i=0}^k \begin{Bmatrix}k\\i\end{Bmatrix}{n\choose i}i!
\]

那么将答案式化简

\[\begin{aligned}
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的文明世界(第二类斯特林数,动态规划)的更多相关文章

  1. [国家集训队] Crash 的文明世界(第二类斯特林数)

    题目 [国家集训队] Crash 的文明世界 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 \[\begin{aligned} ans_x&=\sum\limi ...

  2. BZOJ 2159: Crash 的文明世界 第二类斯特林数+树形dp

    这个题非常巧妙啊~ #include <bits/stdc++.h> #define M 170 #define N 50003 #define mod 10007 #define LL ...

  3. bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...

  4. P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)

    传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...

  5. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  6. BZOJ 2159: Crash 的文明世界(组合数学+第二类斯特林数+树形dp)

    传送门 解题思路 比较有意思的一道数学题.首先\(n*k^2\)的做法比较好想,就是维护一个\(x^i\)这种东西,然后转移的时候用二项式定理拆开转移.然后有一个比较有意思的结论就是把求\(x^i\) ...

  7. BZOJ2159 Crash的文明世界——树上DP&&第二类Stirling数

    题意 给定一个有 $n$ 个结点的树,设 $S(i)$ 为第 $i$ 个结点的“指标值”,定义为 $S(i)=\sum_{i=1}^{n}dist(i,j)^k$,$dist(i, j)$ 为结点 $ ...

  8. 题解 [BZOJ2159] Crash的文明世界

    题面 解析 这题一眼换根DP啊 首先,我们考虑一下如何转换\(n^m\)这个式子, 先把式子摆出来吧:\(n^m=\sum_{j=0}^mS(m,j)C_n^jj!\) 其中\(S(m,j)\)表示第 ...

  9. 【BZOJ5093】图的价值(第二类斯特林数,组合数学,NTT)

    [BZOJ5093]图的价值(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 单独考虑每一个点的贡献: 因为不知道它连了几条边,所以枚举一下 \[\sum_{i=0}^{n-1}C_{n-1 ...

随机推荐

  1. 广电的宽带网络真流氓,替换google的广告为百度的广告

    以前联通也有干过这事,最近联通,有没有继续干,不清楚.没有用联通了. 最近,连到某wifi,发现网站的google广告,居然显示成百度的,特别去访问另一家网站,发现,本该是google广告的位置,同样 ...

  2. 表单验证(AngularJs)

    这次,学习angularjs的表单的验证,angularjs提供上表几种状态验证: 状态 描述 $invalid 未通过验证 $valid 经过验证 $pristine 未修改过 $dirty 修改 ...

  3. Luogu P3959 宝藏

    这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分. 听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的 prim是一种基于贪心的算法,在本题中由于盲目的选择当前最 ...

  4. [Oracle]为何Archivelog 没有马上被删除

    [Oracle]为何Archivelog 没有马上被删除 客户设置了 Archivelog 的 deletion policy 是 CONFIGURE ARCHIVELOG DELETION POLI ...

  5. Docker 快速验证 HTML 导出 PDF 高效方案

    需求分析 项目中用到了 Echarts,想要把图文混排,当然包括 echarts 生成的 Canvas 图也导出 PDF. 设计和实现时,分析了 POI.iText.freemaker.world 的 ...

  6. [UWP 自定义控件]了解模板化控件(4):TemplatePart

    1. TemplatePart TemplatePart(部件)是指ControlTemplate中的命名元素.控件逻辑预期这些部分存在于ControlTemplate中,并且使用protected ...

  7. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理结果适配篇(7/8)

    文章目录 前情概要 前面一大坨一大坨的代码把route.controller.action.attribute都搞完事儿了,最后剩下一部分功能就是串起来的调用. 那接下就说个说第二个中间件,也是最后一 ...

  8. C#_获取路径

    一.获取当前文件的路径 1.  System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName  获取模块的完整路径,包括文件名. ...

  9. zabbix中配置当memory剩余不足20%时触发报警

    在zabbix中默认当内存剩余量不足2G的时候触发报警,并没有使用百分比来触发如下: 现在需要配置:当memory剩余不足20%时触发报警,具体操作方法如下: 1)创建itemConfiguratio ...

  10. PHP从入门到精通(四)

    PHP数组中的常用函数汇总 为了更直观的讲解各函数的作用和用法,方便大家的理解,首先,我们来定义一个数组.下面各函数的操作将以本数组为例: $arr = array(1,2,3,4,5,6," ...