题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159

使用公式:\( n^{k} = \sum\limits_{i=0}^{k} S(k,i) * i! * C_{n}^{i} \)

所以维护 \( f[x][i] = \sum\limits_{u\in subtree[x],d=dist(x,u)} C_{d}^{i} \)

然后利用 \( C_{n}^{m} = C_{n-1}^{m} + C_{n-1}^{m-1} \),可以树形DP过程中维护(原来想着可以线段树维护矩阵来着,呵呵)。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=,xm=,mod=;
int n,m,hd[xn],ct,to[xn<<],nxt[xn<<],f[xn][xm],g[xm],t[xn][xm];
int ans[xn],s[xm][xm],jc[xm];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
void dfs(int x,int fa)
{
f[x][]=;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
dfs(u,x);
f[x][]=upt(f[x][]+f[u][]);
for(int k=;k<=m;k++)f[x][k]=upt(f[x][k]+f[u][k]+f[u][k-]);
}
}
void dfsx(int x,int fa)
{
if(!fa)memcpy(t[x],f[x],sizeof f[x]);
else
{
t[x][]=upt(f[x][]+g[]);
for(int k=;k<=m;k++)t[x][k]=upt(f[x][k]+g[k]+g[k-]);//sum of C(d,k)
}
for(int i=;i<=m;i++)
ans[x]=(ans[x]+(ll)s[m][i]*jc[i]%mod*t[x][i])%mod;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
g[]=upt(t[x][]-f[u][]);
for(int k=;k<=m;k++)g[k]=upt(t[x][k]-(f[u][k]+f[u][k-]));
dfsx(u,x);
}
}
void init()
{
jc[]=;
for(int i=;i<=m;i++)jc[i]=(ll)jc[i-]*i%mod;
s[][]=;
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)
s[i][j]=upt(s[i-][j-]+j*s[i-][j]);
}
int main()
{
n=rd(); m=rd(); int L=rd();
int now=rd(),A=rd(),B=rd(),Q=rd();
for(int i=;i<n;i++)
{
now = (now * A + B) % Q;
int tmp = (i < L) ? i : L;
int x=i-now%tmp,y=i+;
add(x,y); add(y,x);
}
init();
dfs(,); dfsx(,);
for(int i=;i<=n;i++)printf("%d\n",ans[i]);
return ;
}

bzoj2159

update(2018.12.16)

http://acm.hdu.edu.cn/showproblem.php?pid=4625

几乎是一模一样的题;

只是在子函数里传个数组,会莫名不对...还是开成全局的了...

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=5e4+,xm=,mod=;
int n,k,hd[xn],ct,to[xn<<],nxt[xn<<],f[xn][xm],g[xm];
int jc[xm],s[xm][xm],ans[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void init()
{
int mx=;
jc[]=;
for(int i=;i<=mx;i++)jc[i]=(ll)jc[i-]*i%mod;
s[][]=;
for(int i=;i<=mx;i++)
for(int j=;j<=i;j++)
s[i][j]=(s[i-][j-]+(ll)s[i-][j]*j)%mod;
}
void dfs(int x,int fa)
{
f[x][]=;//
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
dfs(u,x);
for(int j=;j<=k;j++)f[x][j]=upt(f[x][j]+f[u][j]+(j?f[u][j-]:));
}
}
/*
void dfsx(int x,int fa,int *t)
{
if(fa)for(int i=k;i>=0;i--)t[i]=upt(t[i]+(i?t[i-1]:0));
for(int j=0;j<=k;j++)
ans[x]=(ans[x]+(ll)s[k][j]*jc[j]%mod*(f[x][j]+t[j]))%mod;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
for(int j=0;j<=k;j++)g[j]=upt(t[j]+f[x][j]-f[u][j]-(j?f[u][j-1]:0));
dfsx(u,x,g);
}
}
*/
int t[xn][xm];
void dfsx(int x,int fa)
{
if(!fa)memcpy(t[x],f[x],sizeof f[x]);
else for(int j=;j<=k;j++)t[x][j]=upt(f[x][j]+g[j]+(k?g[j-]:));
ans[x]=;
for(int i=;i<=k;i++)
ans[x]=(ans[x]+(ll)s[k][i]*jc[i]%mod*t[x][i])%mod;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
for(int j=;j<=k;j++)g[j]=upt(t[x][j]-(f[u][j]+(j?f[u][j-]:)));
dfsx(u,x);
}
}
int main()
{
int T=rd(); init();
while(T--)
{
ct=; memset(hd,,sizeof hd);
memset(f,,sizeof f); memset(g,,sizeof g);
n=rd(); k=rd();
for(int i=,x,y;i<n;i++)x=rd(),y=rd(),add(x,y),add(y,x);
dfs(,); dfsx(,);
for(int i=;i<=n;i++)printf("%d\n",ans[i]);
}
return ;
}

hdu 4625

bzoj 2159 Crash 的文明世界 & hdu 4625 JZPTREE —— 第二类斯特林数+树形DP的更多相关文章

  1. bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...

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

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

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

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

  4. BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】

    题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...

  5. P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)

    传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...

  6. bzoj 2159: Crash 的文明世界

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

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

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

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

    题意 给定一棵 \(n\) 个点的树和一个常数 \(k\) , 对于每个 \(i\) , 求 \[\displaystyle S(i) = \sum _{j=1} ^ {n} \mathrm{dist ...

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

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

随机推荐

  1. Map输出数据的处理类MapOutputBuffer分析

    MapOutputBuffer顾名思义就是Map输出结果的一个Buffer,用户在编写map方法的时候有一个参数OutputCollector: void map(K1 key, V1 value, ...

  2. Jquery EasyUI弹出窗体

    $("#btnCreate").click(function () { $("#modalwindow").html("<iframe widt ...

  3. python 基础 4.1 函数的参数

    #/usr/bin/python #coding=utf-8 #@Time   :2017/10/24 9:09 #@Auther :liuzhenchuan #@File   :函数的参数.py # ...

  4. wamp环境配置;转自发瑞的博客(www.cnblogs.com/cyrfr/p/6483529.html)

    php手动搭建环境有好多种组合,版本号不一致,会导致搭建失败. 我搭建的组合是: php5.6+MySQL5.6+Apache2.4的组合. 一.PHP语言包下载 首先从官网上下载php5.6 htt ...

  5. DBUtils使用详解

    https://blog.csdn.net/samjustin1/article/details/52220423 https://www.cnblogs.com/CQY1183344265/p/58 ...

  6. VS2012,VS2013启用SQLite的Data Provider界面显示

    VS2012,VS2013启用SQLite的Data Provider界面显示 VS 2012默认是不带的SQLite的Data Provider,所以无法直接在VS 2012里管理SQLite的数据 ...

  7. 性能测试--Jmeter之wordpress示例

    Jmeter之wordpress示例 WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理 ...

  8. 远程服务器上的weblogic项目管理(三)常用指令及常见错误

    weblogic的管理流程已在前两节整理完毕,接下来汇总一下linux环境下的weblogic管理常用指令及常见错误: 常用指令: ./startWebLogic.sh 启动weblogic ./st ...

  9. SAP-Function

    [转]sap函数大全 ********SAP中常用函数 函数名 描述SD_VBAP_READ_WITH_VBELN 根据销售订单读取表vbap中的信息EDIT_LINES 把READ_TEXT返回的L ...

  10. gradle 跳过junitTest的方法

    Web项目中不长会写JunitTest,但也会写.gradle build的时候回执行test 这项task.如果想跳过,通常有几种方法: 1.在build.gradle 文件中禁用task test ...