BZOJ

洛谷


挺套路但并不难的一道题

\(Description\)

给定一棵\(n\)个点的树和\(K\),边权为\(1\)。对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis(x,i)^K\)。

\(n\leq50000,\ k\leq150\)。

\(Solution\)

和其它求\(x^k\)的题一样,依旧用第二类斯特林数展开。(二项式定理依旧可以得到部分分,依旧不想看=-=)

\[\begin{aligned}S(x)&=\sum_{i=1}^ndis(x,i)^K\\&=\sum_{i=1}^n\sum_{k=0}^{dis(x,i)}S(K,k)\cdot k!\cdot \binom{dis(x,i)}{k}\\&=\sum_{i=1}^n\sum_{k=0}^KS(K,k)\cdot k!\cdot \binom{dis(x,i)}{k}\\&=\sum_{k=0}^KS(K,k)\cdot k!\cdot\sum_{i=1}^n\binom{dis(x,i)}{k}\end{aligned}
\]

考虑这个\(\sum_{i=1}^n\binom{dis(x,i)}{k}\)怎么算。用阶乘公式拆还是一样没法算,尝试用这个公式拆:\(\binom nm=\binom{n-1}m\times\binom{n-1}{m-1}\):

\[\sum_{i=1}^n\binom{dis(x,i)}{k}=\sum_{i=1}^n\binom{dis(x,i)-1}{k}+\sum_{i=1}^n\binom{dis(x,i)-1}{k-1}
\]

记\(f[x][k]=\sum_{i=1}^n\binom{dis(x,i)}{k}\),那么可以由\(x\)的相邻点\(v\)的\(f[v][k]+f[v][k-1]\)转移来(\(x\)和\(v\)与其它点的\(dis\)正好差\(1\))。

具体就是两遍树形DP,第一次自底向上求出子树内的点到\(x\)的\(dis\)的贡献,即\(f[x][i]=\sum_{v\in son[x]}f[v][i]+f[v][i-1]\);第二次从上往下更新子树外的点到\(v=son[x]\)的\(dis\)的贡献,记为\(g[v][i]=g[x][i]+g[x][i-1]+(f[x][i]-f[v][i]-f[v][i-1])+(f[x][i-1]-f[v][i-1]-f[v][i-2])\)。

然后统计一下就OK了。复杂度\(O(nk+k^2)\)。

明明取模优化的不少啊,怎么就这么慢呢=-=


//33844kb	4868ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define mod 10007
#define Mod(x) x>=mod&&(x-=mod)
#define Add(x,v) (x+=v)>=mod&&(x-=mod)
typedef long long LL;
const int N=50003,M=153; int K,Enum,H[N],nxt[N<<1],to[N<<1],f[N][M]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline void AE(int u,int v)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
void DFS1(int x,int fa)
{
f[x][0]=1;//这个初始化...C(dis(x,x),0)=1?有点小懵逼=-=
int K=::K;
for(int i=H[x],v; i; i=nxt[i])
if((v=to[i])!=fa)
{
DFS1(v,x), f[x][0]+=f[v][0];
for(int j=1; j<=K; ++j) f[x][j]+=f[v][j]+f[v][j-1];
}
for(int i=0; i<=K; ++i) f[x][i]%=mod;
}
void DFS2(int x,int fa)
{
static int g[N];
int K=::K;
for(int i=H[x],v; i; i=nxt[i])
if((v=to[i])!=fa)
{
g[0]=f[x][0]+mod-f[v][0];
for(int j=1; j<=K; ++j) g[j]=f[x][j]+mod-f[v][j]+mod-f[v][j-1];//g[j] = g[x][j]+f[x][j]-f[v][j]-f[v][j-1]
f[v][0]=(f[v][0]+g[0])%mod;
for(int j=1; j<=K; ++j) f[v][j]=(f[v][j]+g[j]+g[j-1])%mod;
DFS2(v,x);
}
} int main()
{
static int S[M][M];
const int n=read(),K=read(); ::K=K;
// for(int i=1; i<n; ++i) AE(read(),read());
for(int L=read(),now=read(),A=read(),B=read(),Q=read(),i=1; i<n; ++i)
now=(now*A+B)%Q, AE(i-now%(i<L?i:L),i+1); DFS1(1,1), DFS2(1,1), S[0][0]=1;
for(int i=1; i<=K; ++i)
for(int j=1; j<=i; ++j) S[i][j]=(S[i-1][j-1]+S[i-1][j]*j)%mod;
for(int x=1; x<=n; ++x)
{
LL ans=0;
for(int i=0,fac=1; i<=K; ++i) ans+=1ll*S[K][i]*fac*f[x][i]%mod, fac=fac*(i+1)%mod;
printf("%d\n",(int)(ans%mod));
} return 0;
}

BZOJ.2159.Crash的文明世界(斯特林数 树形DP)的更多相关文章

  1. 【BZOJ2159】Crash的文明世界 斯特林数+树形dp

    Description Crash 小朋友最近迷上了一款游戏--文明5(Civilization V).在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家.现 ...

  2. [BZOJ2159]Crash的文明世界(斯特林数+树形DP)

    题意:给定一棵树,求$S(i)=\sum_{j=1}^{n}dist(i,j)^k$.题解:根据斯特林数反演得到:$n^m=\sum_{i=0}^{n}C(n,i)\times i!\times S( ...

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

    题意 给定一棵 \(n\) 个点的树和一个常数 \(k\) , 对于每个 \(i\) , 求 \[\displaystyle S(i) = \sum _{j=1} ^ {n} \mathrm{dist ...

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

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

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

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 使用公式:\( n^{k} = \sum\limits_{i=0}^{k} S(k,i ...

  7. bzoj 2159: Crash 的文明世界

    Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 480  Solved: 234[Submit][Status][Discuss] Descripti ...

  8. [bzoj 2159]Crash的文明世界

    今天看到一个鬼题 心情好的时候写 [题意]求树上所有点对距离的k次方和,所有边权为1 大爷方的题解:http://tonyfang.is-programmer.com/posts/204972.htm ...

  9. 洛谷P4827 [国家集训队] Crash 的文明世界 [斯特林数,组合数,DP]

    传送门 思路 又见到这个\(k\)次方啦!按照套路,我们将它搞成斯特林数: \[ ans_x=\sum_{i=0}^k i!S(k,i)\sum_y {dis(x,y) \choose i} \] 前 ...

随机推荐

  1. poj2817状态压缩 升维

    /* 两两求出字符串之间最大可以匹配的值 由已知状态推导出位置状态 状态s表示已经加入到集合中的字符串,0表示串i不存在,1存在 由于字符串的加入顺序会影响结果,所以增加一维来表示 dp[S][i]表 ...

  2. Allegro PCB Design GXL (legacy) 由零散的对象构成一个Shape

    Allegro PCB Design GXL (legacy) version 16.6-2015 从DXF文件中导入板框之后,发现板框是由Line Segment.Arc Segment等对象组成, ...

  3. jQuery之导航菜单(点击该父节点时子节点显示,同时子节点的同级隐藏,但是同级的父节点始终显示)

    注:对于同一个对象不超过3个操作的,可直接写成一行,超 过3个操作的建议每行写一个操作.这样可读性较强,可提高代码的可读性和可维护性 核心代码: $(".has_children" ...

  4. AI-URL注册器

    官方文档地址:https://www.django-rest-framework.org/tutorial/quickstart/#serializers #url生成器生成四个url,就可以访问关于 ...

  5. 详解C程序编译、链接与存储空间布局

    被隐藏了的过程 现如今在流行的集成开发环境下我们很少需要关注编译和链接的过程,而隐藏在程序运行期间的细节过程可不简单,即使使用命令行来编译一个源代码文件,简单的一句"gcc hello.c& ...

  6. 51 nod 1181 质数中的质数(质数筛法)

    1181 质数中的质数(质数筛法) 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的 ...

  7. hive表中字段显示为NULL时,HDFS文件中存储为\N

    hive数据落地到hdfs,null会默认用'\N'存储 解决方式1:利用命令(这个我没起效果) alter table adl_cici_test_fdt set serdeproperties(' ...

  8. Maya闪退

    电脑上装的Maya2015突然就打不开了,窗口闪一下就关闭,也没有任何提示. 将15卸载装了Maya2016还是一样. 再彻底卸载16,装了15,还不行... 将系统环境变量中PYTHONHOME和P ...

  9. Sql与C#中日期格式转换总结

    SQL中的转换方法: 一.将string转换为datetime,主要是使用Convert方法, 方法,Convert(datetime [ ( length ) ] , expression, [st ...

  10. Asp.net MVC - 使用PRG模式(附源码)

    阅读目录: 一. 传统的Asp.net页面问题 二.Asp.net MVC中也存在同样的问题 三.使用PRG模式 四.PRG模式在MVC上的实现 一. 传统的Asp.net页面问题 一个传统的Asp. ...