【bzoj 2159】Crash 的文明世界
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 的文明世界的更多相关文章
- bzoj 2159: Crash 的文明世界
Time Limit: 10 Sec Memory Limit: 259 MB Submit: 480 Solved: 234[Submit][Status][Discuss] Descripti ...
- BZOJ.2159.Crash的文明世界(斯特林数 树形DP)
BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis( ...
- BZOJ 2159: Crash 的文明世界(树形dp+第二类斯特林数+组合数)
题意 给定一棵 \(n\) 个点的树和一个常数 \(k\) , 对于每个 \(i\) , 求 \[\displaystyle S(i) = \sum _{j=1} ^ {n} \mathrm{dist ...
- bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...
- 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 ...
- [bzoj 2159]Crash的文明世界
今天看到一个鬼题 心情好的时候写 [题意]求树上所有点对距离的k次方和,所有边权为1 大爷方的题解:http://tonyfang.is-programmer.com/posts/204972.htm ...
- bzoj 2159 - Crash 的 文明世界
Description 给定一棵\(n\le 10^5\)的树, 和\(k\le 150\) 求每个点\(x\)的\[S(x) = \sum_{y=1}^n dis(x, y) ^ k\] Analy ...
- BZOJ 2159: Crash 的文明世界 第二类斯特林数+树形dp
这个题非常巧妙啊~ #include <bits/stdc++.h> #define M 170 #define N 50003 #define mod 10007 #define LL ...
- BZOJ 2159: Crash 的文明世界(组合数学+第二类斯特林数+树形dp)
传送门 解题思路 比较有意思的一道数学题.首先\(n*k^2\)的做法比较好想,就是维护一个\(x^i\)这种东西,然后转移的时候用二项式定理拆开转移.然后有一个比较有意思的结论就是把求\(x^i\) ...
- 【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)
[BZOJ2159]Crash的文明世界(第二类斯特林数,动态规划) 题面 BZOJ 洛谷 题解 看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\) ...
随机推荐
- asp.net FromBody接收不到参数的解决方法
今天改一个前端框架(angularjs,不兼容ie内核,需要修改),后台框架是已经写好了的,不用修改. 接口接收参数如下: [HttpPost] public async Task<Schedu ...
- Java jar包启动脚本
#!/bin/bash APP_HOME=/wdcloud/app/rps/rps-module-admin APP_JAR=rps-module-admin-*.jar APP_PIDS=$(ps ...
- MySQL replace into (insert into 的增强版)
在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错: Error Code: 1062. Duplicate entry 'XXXXX' for ke ...
- ESP8266最小系统
http://www.dnsj88.com/Products/esp12f.html https://gitai.me/2017/04/Re-Zero-Starting-in-IoT/
- 记一次在咸鱼上购买 MacBook Pro 的经历
前言 以前一直用的是 windows 的,但是最近特别想买个 macOS 的.其实不是为了其他什么目的,只是涉及到开发 macOS更接近 linux 系统,一直没使用过所以就想尝试体验下,而且现在很多 ...
- 关于win7+VS2017环境下的opencv-contirb配置的一个坑
问题出现背景: 由于课题需要用到SURF detector, 我依照网上的一下教程,把opencv-contrib的配置了一遍.但是,当我写了一个小demo来测试模块是否能正常使用的时候,程序能正常编 ...
- Linux学习之路3-HelloWorld
1.window系统上创建helloworld.c文件,并编写程序 #include <stdio.h> main(){ printf("Hello World!"); ...
- tensorflow-TensorBoard
Tensorborad--> 是Tensorflow的可视化工具,它可以通过Tensorflow程序运行过程中输出的日志文件可视化Tensorflow程序的运行状态.Tensorflow和Ten ...
- MT【326】曲线中的爱恨情仇
[我思故我在]----笛卡尔爱心曲线$r=a(1-sin\theta)$ Matrix 67分手曲线
- Re.多项式除法/取模
前言 emmm又是暂无 前置 多项式求逆 多项式除法/取模目的 还是跟之前一样顾名思义] 给定一个多项式F(x),请求出多项式Q(x)和R(x),满足F(x)=Q(x)∗G(x)+R(x),R项数小于 ...