洛谷P4827 [国家集训队] Crash 的文明世界 [斯特林数,组合数,DP]
思路
又见到这个\(k\)次方啦!按照套路,我们将它搞成斯特林数:
\]
前面可以枚举,考虑后面那东西怎么求。
我们不知道为什么但就是考虑DP:设:
up_{x,t}=\sum_{y\notin x} {dis(x,y) \choose t}
\]
其中\(y\in x\)表示\(y\)在\(x\)的子树内。
显然\(dn\)比较好求,我们先搞\(dn\)。
dn_{x,t}&=\sum_{y\in x} {dis(x,y) \choose t}\\
&=[t=0]+\sum_v \sum_{y\in v} {dis(v,y)+1 \choose t}\\
&=[t=0]+\sum_v \sum_{y\in v} \left( {dis(v,y) \choose t} + {dis(v,y) \choose t-1} \right)\\
&=[t=0]+\sum_v (dp_{v,t} + dp_{v,t-1})
\end{align*}
\]
接下来是\(up\)。
up_{x,t}&=\sum_{y\notin x} {dis(x,y) \choose t}\\
&=\sum_{y\notin fa} {dis(fa,y)+1\choose t} +\sum_{y\in fa} {dis(fa,y)+1\choose t}-\sum_{y\in x} {dis(x,y)+2\choose t}\\
&=up_{fa,t}+up_{fa,t-1}+dn_{fa,t}+dn_{fa,t-1}-dn_{x,t}-2dn_{x,t-1}-dn_{x,t-2}
\end{align*}
\]
特判一下\(up_{1,t}=0\)即可。
至此,问题结束。
复杂度\(O(nk)\)。
代码
推了那么长的式子,代码其实超短。
#include<bits/stdc++.h>
namespace my_std{
using namespace std;
#define pii pair<int,int>
#define fir first
#define sec second
#define MP make_pair
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define drep(i,x,y) for (int i=(x);i>=(y);i--)
#define go(x) for (int i=head[x];i;i=edge[i].nxt)
#define sz 50505
#define mod 10007
typedef long long ll;
typedef double db;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template<typename T>inline T rnd(T l,T r) {return uniform_int_distribution<T>(l,r)(rng);}
template<typename T>inline void read(T& t)
{
t=0;char f=0,ch=getchar();double d=0.1;
while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
if(ch=='.'){ch=getchar();while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();}
t=(f?-t:t);
}
template<typename T,typename... Args>inline void read(T& t,Args&... args){read(t); read(args...);}
void file()
{
#ifndef ONLINE_JUDGE
freopen("a.txt","r",stdin);
#endif
}
#ifdef mod
ll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;return ret;}
ll inv(ll x){return ksm(x,mod-2);}
#else
ll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x) if (y&1) ret=ret*x;return ret;}
#endif
// inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std;
int n,K;
struct hh{int t,nxt;}edge[sz<<1];
int head[sz],ecnt;
void make_edge(int f,int t)
{
edge[++ecnt]=(hh){t,head[f]};
head[f]=ecnt;
edge[++ecnt]=(hh){f,head[t]};
head[t]=ecnt;
}
ll up[sz][233],dn[sz][233];
#define v edge[i].t
void dfs1(int x,int fa)
{
dn[x][0]=1;
go(x) if (v!=fa)
{
dfs1(v,x);
(dn[x][0]+=dn[v][0])%=mod;
rep(j,1,K) (dn[x][j]+=dn[v][j]+dn[v][j-1])%=mod;
}
}
void dfs2(int x,int fa)
{
if (x!=1)
{
up[x][0]=(up[fa][0]+dn[fa][0]-dn[x][0]+mod)%mod;
up[x][1]=(up[fa][1]+up[fa][0]+dn[fa][1]+dn[fa][0]-dn[x][1]-2*dn[x][0]+mod*3)%mod;
rep(i,2,K) up[x][i]=(up[fa][i]+up[fa][i-1]+dn[fa][i]+dn[fa][i-1]-dn[x][i]-2*dn[x][i-1]-dn[x][i-2]+mod*4)%mod;
}
go(x) if (v!=fa) dfs2(v,x);
}
#undef v
ll S[233][233];
ll fac[233];
int main()
{
file();
int x,y;
read(n,K);
rep(i,1,n-1) read(x,y),make_edge(x,y);
dfs1(1,0);dfs2(1,0);
fac[0]=1;rep(i,1,K) fac[i]=fac[i-1]*i%mod;
S[0][0]=1;
rep(i,1,K)
rep(j,1,K)
S[i][j]=(S[i-1][j-1]+1ll*j*S[i-1][j]%mod)%mod;
rep(i,1,n)
{
ll ans=0;
rep(j,0,K) ans=(ans+fac[j]*S[K][j]%mod*(up[i][j]+dn[i][j])%mod)%mod;
printf("%lld\n",ans);
}
return 0;
}
洛谷P4827 [国家集训队] Crash 的文明世界 [斯特林数,组合数,DP]的更多相关文章
- 洛谷 P4827 [国家集训队] Crash 的文明世界
题目描述 给你一棵 n 个点的树,对于树上的每个节点 i,求 \(\sum_{j=1}^ndis(i,j)^k\).其中 \(dis(i,j)\) 为两点在树上的距离. 输入格式 第一行两个整 ...
- P4827 [国家集训队] Crash 的文明世界
传送门:洛谷 题目大意:设$$S(i)=\sum_{j=1}^ndis(i,j)^k$$,求$S(1),S(2),\ldots,S(n)$. 数据范围:$n\leq 50000,k\leq 150$ ...
- 【BZOJ2159】Crash的文明世界 斯特林数+树形dp
Description Crash 小朋友最近迷上了一款游戏--文明5(Civilization V).在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家.现 ...
- BZOJ.2159.Crash的文明世界(斯特林数 树形DP)
BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis( ...
- P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)
传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...
- [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( ...
- [国家集训队] Crash 的文明世界(第二类斯特林数)
题目 [国家集训队] Crash 的文明世界 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 \[\begin{aligned} ans_x&=\sum\limi ...
- 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告
[国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...
- 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)
题意 题目链接:https://www.luogu.org/problem/P4827 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...
随机推荐
- [译]Domain Events Pattern Example
原文 完整源码 本文展示的是一个关于网上调查的项目.想象下,当用户完成了一个调查,我们想通知所有人调查已经结束,分配一个人去检查调用问卷. 领域对象 public class Survey { pub ...
- 使用vlfeat 包中遇到的问题
run('..../setup'); vl_complie(); 编译成功,但是仍然出现Invalid MEX-file ‘E:\vlfeat-0.9.20\toolbox\mex\mexw64\vl ...
- SQL 查看表字段及说明
select A.comments,A.column_name,B.DATA_TYPE||'('||B.DATA_LENGTH||')' from user_col_comments A inner ...
- C语言编程程序的内存如何布局
重点关注以下内容: C语言程序在内存中各个段的组成 C语言程序连接过程中的特性和常见错误 C语言程序的运行方式 一:C语言程序的存储区域 由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过 ...
- No compiler is provided in this environment. --Maven build失败
今天,maven build 失败了, 遇到下面的问题 经过查找,通过这个大佬的blog( https://blog.csdn.net/lslk9898/article/details/738367 ...
- MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...
- redis-set
Java HashSet 无序,不重复. Redis操作中,涉及到两个大数据集合的并集,交集,差集运算. 赋值: sadd key values[value1.value2…]:向set中添加数据, ...
- UVA1660 电视网络 Cable TV Network
题目地址:UVA1660 电视网络 Cable TV Network 枚举两个不直接连通的点 \(S\) 和 \(T\) ,求在剩余的 \(n-2\) 个节点中最少去掉多少个可以使 \(S\) 和 \ ...
- [Jenkins]CentOS7下Jenkins搭建
最近在倒腾Kubernetes的一些东西,这次需要用到Jenkins来实现自动化构建.来讲一讲搭建的整个过程. Jenkins是什么 Jenkins提供了软件开发的持续集成服务.它运行在Servlet ...
- MOOC Linux内核之旅小结【转】
转自:https://blog.csdn.net/titer1/article/details/45345123 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...