洛谷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\) ,求出 \( ...
随机推荐
- Python中json一点小知识
import json dic={ "name":"杨林" } ret=json.dumps(dic,ensure_ascii=False) #因为json.d ...
- asp.net mvc5 多语言应用
需求:有些网站需要多语言显示,比如简体中文,繁体中文,英文. 1.创建一个mvc项目: 2.创建App_GlobalResources 创建了中文.英文两个语言的资源文件,中文是程序的默认语言,所以我 ...
- 手动写Entity Framework 数据库上下文和Model实体
1.引用EF对应的程序集 使用命令安装EntityFramework包Install-Package EntityFramework Entity Framework简单目录: 1.context数据 ...
- [Python]基于K-Nearest Neighbors[K-NN]算法的鸢尾花分类问题解决方案
看了原理,总觉得需要用具体问题实现一下机器学习算法的模型,才算学习深刻.而写此博文的目的是,网上关于K-NN解决此问题的博文很多,但大都是调用Python高级库实现,尤其不利于初级学习者本人对模型的理 ...
- Java SE之反射技术[Class,Field](一)
一.什么是反射? 反射库(Reflection Library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序.这项功能被大量地应用在JavaBeans中,它是Java组 ...
- 商业版微信小程序开发流程
一.产品阶段 ①功能规划思维导图——产品经理了解清楚整个项目需求,产出清晰明确的功能需求说明. ②需求报价预算——产品经理确定好功能需求后,输出整个项目开发的报价方案. ③组建技术开发团队——初步确认 ...
- Hbase思维导图之物理模型
- java.lang.NoSuchMethodError: org.apache.curator.framework.api.CreateBuilder.creatingParentsIfNeeded()Lorg/apache/curator/framework/api/ProtectACLCreateModeStatPathAndBytesable;
1 错误信息 java.lang.NoSuchMethodError: org.apache.curator.framework.api.CreateBuilder.creatingParentsIf ...
- git查看某个文件的提交记录
git log --pretty=oneline 文件路径/文件名 git show 提交id
- 【提取元素的值 】【追加文本append】【删除文本remove】【class的操作】【读取元素的宽度,高度】
1.取值 $("#test").text() //取id=test里面的文字 $("#test&qu ...