Description

Crash小朋友最近迷上了一款游戏——文明5(Civilization V)。在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家。现在Crash已经拥有了一个N个城市的国家,这些城市之间通过道路相连。由于建设道路是有花费的,因此Crash只修建了N-1条道路连接这些城市,不过可以保证任意两个城市都有路径相通。在游戏中,Crash需要选择一个城市作为他的国家的首都,选择首都需要考虑很多指标,有一个指标是这样的:$S(i)=\sum _{j=1}^Ndist(i,j)^k$。其中S(i)表示第i 个城市的指标值,dist(i, j)表示第i个城市到第j个城市需要经过的道路条数的最小值,k为一个常数且为正整数。因此Crash交给你一个简单的任务:给出城市之间的道路,对于每个城市,输出这个城市的指标值,由于指标值可能会很大,所以你只需要输出这个数 mod 10007 的值。

Input

输入的第一行包括两个正整数N和k。下面有N-1行,每行两个正整数u、v (1 ≤ u, v ≤ N),表示第u个城市和第v个城市之间有道路相连。这些道路保证能符合题目的要求。

Output

输出共N行,每行一个正整数,第i行的正整数表示第i个城市的指标值 mod 10007 的值。

用结论来化简式子:$x^n=\sum _{i=1}^n S(n,i)\cdot F(x,i)$

$S(n,i)$为第二类斯特林数,$F(x,i)=\frac{x!}{(x-i)!}$

可得:$$\begin{align*} ans(i)&=\sum _{j=1}^ndist(i,j)^m\\ &=\sum_{j=1}^{n}\sum_{k=1}^{m}S(m,k)\cdot F(dist(i,j),k)\\ &=\sum_{k=1}^{m}S(m,k)\sum_{j=1}^{n} F(dist(i,j),k)\\ &=\sum_{k=1}^{m}S(m,k)\cdot k!\cdot \sum_{j=1}^{n} C(dist(i,j),k) \end{align*}$$

根据组合数递推公式:$C(n,m)=C(n-1,m)+C(n-1,m-1)$ 就可以很方便的对后面的部分进行树形dp了。

具体地,令 $up(x,i)$ 为不在 $x$ 的子树中的部分的贡献,令 $dn(x,i)$ 为 $x$ 的子树的贡献。特别的,$dn(x,0)=1$。

详见代码。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=5e4+;
const int M=;
const int mod=1e4+;
int n,m,u,v,cnt,ans,tmp;
int first[N],fac[M],s[M][M];
int up[N][M],dn[N][M];
struct edge{int to,next;}e[N*];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
void ins(int u,int v){e[++cnt]=(edge){v,first[u]};first[u]=cnt;}
void Mod(int& a,int b){a+=b;if(a>=mod)a-=mod;}
void dfs1(int x,int fa)
{
dn[x][]=;
for(int i=first[x];i;i=e[i].next)
{
int to=e[i].to;
if(to==fa)continue;
dfs1(to,x);
Mod(dn[x][],dn[to][]);
for(int j=;j<=m;j++)
Mod(dn[x][j],(dn[to][j]+dn[to][j-])%mod);
}
}
void dfs2(int x,int fa)
{
if(fa!=-)
{
up[x][]=n-dn[x][];
for(int i=;i<=m;i++)
{
Mod(up[x][i],(up[fa][i]+up[fa][i-])%mod);
Mod(up[x][i],(dn[fa][i]+dn[fa][i-])%mod);
Mod(up[x][i],(*mod-dn[x][i]-dn[x][i-])%mod);
Mod(up[x][i],(mod-dn[x][i-])%mod);
if(i!=)Mod(up[x][i],(mod-dn[x][i-])%mod);
}
}
for(int i=first[x];i;i=e[i].next)
if(e[i].to!=fa)dfs2(e[i].to,x);
}
int main()
{
int L,now,A,B,Q;
n=read();m=read();L=read();
now=read();A=read();B=read();Q=read();
for(int i=;i<n;i++)
{
now=(now*A+B)%Q;
tmp=i<L?i:L;
u=i-now%tmp;v=i+;
ins(u,v);ins(v,u);
}
// n=read();m=read();
// for(int i=1;i<n;i++)
// {
// u=read();v=read();
// ins(u,v);ins(v,u);
// }
fac[]=s[][]=;
for(int i=;i<=m;i++)
{
fac[i]=fac[i-]*i%mod;
for(int j=;j<=i;j++)
s[i][j]=(s[i-][j]*j+s[i-][j-])%mod;
}
dfs1(,-);dfs2(,-);
for(int i=;i<=n;i++)
{
ans=;
for(int j=;j<=m;j++)
Mod(ans,s[m][j]*fac[j]%mod*(up[i][j]+dn[i][j])%mod);
printf("%d\n",ans);
}
return ;
}

【bzoj 2159】Crash 的文明世界的更多相关文章

  1. bzoj 2159: Crash 的文明世界

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

  2. BZOJ.2159.Crash的文明世界(斯特林数 树形DP)

    BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis( ...

  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 的文明世界 & hdu 4625 JZPTREE —— 第二类斯特林数+树形DP

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

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

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

  7. bzoj 2159 - Crash 的 文明世界

    Description 给定一棵\(n\le 10^5\)的树, 和\(k\le 150\) 求每个点\(x\)的\[S(x) = \sum_{y=1}^n dis(x, y) ^ k\] Analy ...

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

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

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

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

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

    [BZOJ2159]Crash的文明世界(第二类斯特林数,动态规划) 题面 BZOJ 洛谷 题解 看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\) ...

随机推荐

  1. extjs ajax 请求成功也会进入failure

     Ext.Ajax.request({ url: '路径', method : 'post',   params : {     传的参数   }, success: function (action ...

  2. redis数据库的基础

    redis数据库 redis有以下三个特点 redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 redis不仅仅支持简单的key-value类型的数据,同时还提 ...

  3. 【原】无脑操作:HTML5 + CSS + JavaScript实现比赛排程

    1.背景:朋友请帮忙做一个比赛排程软件 2.需求: ① 比赛人数未知,可以通过文本文件读取参赛人员名称: ② 对参赛人员随机分组,一组两人,两两PK,如果是奇数人数,某一个参赛人员成为幸运儿自动晋级: ...

  4. 什么是validationQuery

    validationQuery是用来验证数据库连接的查询语句,这个查询语句必须是至少返回一条数据的SELECT语句.每种数据库都有各自的验证语句,下表中收集了几种常见数据库的validationQue ...

  5. css之overflow应用

    overflow应用的两个小例子: 1.单行文本出现省略号的情况 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  6. ctrl+shift+r / ctrl+f5 强制(不使用缓存)刷新google chrome网页

    我改了csdn图片后, 一直看到的是旧图片, n天之后, 还是旧图片.猜测应该是用了缓存(且缓存更新逻辑失败, 定是csdn的bug), 用ctrl+shift+r, 或者ctrl+f5, 强制刷新页 ...

  7. python学习——读取染色体长度(五:从命令行输入染色体长度)

    # 传递命令行参数 # 导入sys模块 import sys print(sys.argv)   命令行操作 python argv.py 10 20 30 40 50 回车输出 ['argv.py' ...

  8. C# 中利用 CRC32 值判断文件是否重复

    需要在 NuGet 中引用 Crc32.NET 包 直接贴代码了: using Force.Crc32; using System; using System.Collections.Generic; ...

  9. 数据结构学习之栈求解n皇后问题

    数据结构学习之栈求解n皇后问题 0x1 目的 ​ 深入掌握栈应用的算法和设计 0x2 内容 ​ 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...

  10. UI自动化测试之Jenkins配置

    前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家. 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化 ...