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) * 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的更多相关文章
- 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 的文明世界 第二类斯特林数+树形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 的文明世界 【第二类斯特林数 + 树形dp】
题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...
- P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)
传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...
- 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的文明世界
今天看到一个鬼题 心情好的时候写 [题意]求树上所有点对距离的k次方和,所有边权为1 大爷方的题解:http://tonyfang.is-programmer.com/posts/204972.htm ...
随机推荐
- ubuntu16.04----jdk---install----config
1.下载jdk. 2.验证java是否安装,使用java -version命令,如下图所示说明没有安装: 3.在usr目录中创建一个jdk-8目录,如下图所示: 4.配置系统环境变量,编辑/etc/p ...
- jquery 获取 outerHtml
在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包括当前节点本身的代码,然后我们有时候确须要.找遍jQuery api文档也没有不论什么方法能够拿到. 看到有的人通过pa ...
- 【BZOJ2476】战场的数目 矩阵乘法
[BZOJ2476]战场的数目 Description Input 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长.p=0表示输 ...
- 九度OJ 1062:分段函数 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3306 解决:1952 题目描述: 编写程序,计算下列分段函数y=f(x)的值. y=-x+2.5; 0<=x<2 y=2-1. ...
- python manage.py shell 的增删改查
python manage.py shell 的增删改查 guoguo-MacBook-Pro:myblog guoguo$ python manage.py shell Python 3.5.1 ( ...
- 阿里云ecs docker使用(3)
进入docker后安装nodejs 1. 安装nodejs 2. 安装express-generator 3. mkdir repo && cd repo express myapp ...
- ZOJ - 4020 Traffic Light 【BFS】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4020 题意 给出一张地图 以及起点和终点 求是否能从起点走到终点 ...
- LightOJ - 1321 Sending Packets —— 概率期望
题目链接:https://vjudge.net/problem/LightOJ-1321 1321 - Sending Packets PDF (English) Statistics Foru ...
- Android SDK中 tools 目录下的工具介绍
Android SDK包含了各种各样的定制工具,简介如下: Android模拟器(Android Emulator )它是在你的计算机上运行的一个虚拟移动设备.你可以使用模拟器来在一个实际的Andro ...
- BZOJ 1192 [HNOI2006]鬼谷子的钱袋:二进制 砝码称重问题
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1192 题意: 鬼谷子带了a元钱,他要把a元钱分装在小袋子中,使得任意不大于a的数目的钱,都 ...