博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Crash 的文明世界
阅读量:5952 次
发布时间:2019-06-19

本文共 1423 字,大约阅读时间需要 4 分钟。

题目描述

给一棵树,求以每个点为根时下列式子的值。

题解

当k=1时这就是一个经典的换根dp问题。

所以这道题还是要用换根dp解决。

部分分做法:

考虑转移时是这样的一个形式(图是抄的)。

用二项式定理展开就可以nk2做了。

观察到结果是一个xk的形式。

然后这个可以用斯特林数代换。

我们可以先求出每个点的后面的东西,在乘上前面的就是答案了。

这是个组合数,可以用组合数的递推解决。

代码

#include
#include
#define N 50009#define KK 151using namespace std;typedef long long ll;const int mod=10007;int dp[N][KK],f[KK],h[KK],jie[KK];int n,m,a[N],tot,head[N],K,s[KK][KK];inline ll rd(){ ll x=0;char c=getchar();bool f=0; while(!isdigit(c)){
if(c=='-')f=1;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return f?-x:x;}struct edge{
int n,to;}e[N<<1];inline void add(int u,int v){ e[++tot].n=head[u];e[tot].to=v;head[u]=tot; e[++tot].n=head[v];e[tot].to=u;head[v]=tot;}void dfs(int u,int fa){ dp[u][0]=1; for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){ int v=e[i].to;dfs(v,u); (dp[u][0]+=dp[v][0])%=mod; for(int j=1;j<=K;++j)(dp[u][j]+=dp[v][j]+dp[v][j-1])%=mod; }}void dfs2(int u,int fa){ for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){ int v=e[i].to; for(int j=0;j<=K;++j)f[j]=0; f[0]=dp[u][0]-dp[v][0]; for(int j=1;j<=K;++j)(f[j]+=dp[u][j]-dp[v][j-1]-dp[v][j]+mod*2)%=mod; (dp[v][0]+=f[0])%=mod; for(int j=1;j<=K;++j)(dp[v][j]+=f[j]+f[j-1])%=mod; dfs2(v,u); }}int main(){ n=rd();K=rd();int u,v; for(int i=1;i

 

转载于:https://www.cnblogs.com/ZH-comld/p/10265041.html

你可能感兴趣的文章
Web API应用架构在Winform混合框架中的应用(3)--Winfrom界面调用WebAPI的过程分解...
查看>>
微服务演化
查看>>
ELASTIC SEARCH 性能调优
查看>>
jQuery笔记——jQuery选择器实例应用
查看>>
LRU
查看>>
[转]模拟芯片设计的四重境界
查看>>
C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
查看>>
NSLog 使用
查看>>
【翻译】ASP.NET WEB API异常处理
查看>>
UDP打洞实验
查看>>
Agglomerated SSL 1.2.0 发布
查看>>
前端智勇大闯关-第二季-第三题
查看>>
windows 下使用github
查看>>
ubuntu apache fastcgi 虚拟主机安装
查看>>
apache配置directoryindex
查看>>
Linux Bash命令关于程序调试详解
查看>>
趣文:舌尖上的程序猿
查看>>
[LeetCode] 3Sum
查看>>
Mina工具类v1.5
查看>>
Golang在Linux环境下的POSIX风格socket编程
查看>>