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 ...
随机推荐
- ASP.NET机制详细的管道事件流程(转)
ASP.NET机制详细的管道事件流程 第一:浏览器向服务器发送请求. 1)浏览器向iis服务器发送请求网址的域名,根据http协议封装成请求报文,通过dns解析请求的ip地址,接着通过socket与i ...
- Docker入门系列2 安装
可以从 Docker 社区直接下载可用的模版或镜像. Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多. 其次,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Do ...
- arcgis10.0 切片并发布服务及验证
1.切片参考网址:https://jingyan.baidu.com/article/fa4125accc6bef28ac7092d7.html 2.通过下面代码验证 参考网址https://www ...
- insert小细节,大问题
今天现场报流程无法查看,已查看流程表中没有数据了.昨天有运行过删除垃圾数据的脚步.大致过程是: create table bak_test a as select * from test; creat ...
- 开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍
When developing applications for Android, one often facesthe problem of displaying some graphical ...
- EasyPlayerPro windows播放器之多窗口播放音量控制方法
EasyPlayerPro-win基础版本的音频播放为单一通道播放,即同一时间仅允许一个通道播放声音,现应客户需求,在基础版本上实现独立的音频播放,即每个通道可同时播放视频和音频; 设计思路 将音频播 ...
- intellij idea同一个窗口打开多个项目
1 将多个maven项目放在同一个目录 2 file --> open该目录 intellij 将会加载该目录下所有的项目. 3 依赖加载 maven projects--->" ...
- 聚聚科技——php开发笔试题及答案
聚聚科技是一个刚创立的公司,很小很小,人很少,老板感觉是个典型的北京小伙儿,戾气很重,很有个性.笔试题倒是简单: 1. echo(), print(), print_r()的区别? echo是PHP语 ...
- 关于Wix的源代码
Wix的源代码有两种方式可以获得,以3.8为例: 在Release的页面下载wix38-debug.zip 通过SourceCode页面下载,http://wix.codeplex.com/Sourc ...
- 剑指Offer:删除链表的节点【18】
剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3-& ...