bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159
学习材料:https://blog.csdn.net/litble/article/details/80882581
https://www.cnblogs.com/Wuweizheng/p/8638858.html
http://www.cnblogs.com/zhouzhendong/p/Stirling-Number.html
https://blog.csdn.net/qq_35649707/article/details/79929407
https://www.cnblogs.com/gzy-cjoier/p/8426987.html
(O(nlogn)求第一类斯特林数一行的方法:https://www.mina.moe/archives/11349)
第二类斯特林数的公式: \( x^{n}=\sum\limits_{k=0}^{n}C_{x}^{k}*k!*S(n,k) \)
所以一个点 t 的答案为 \( \sum\limits_{j=1}^{N} \sum\limits_{l=0}^{k}S(k,l)*l!*C_{dis(t,j)}^{l} \)
\( = \sum\limits_{l=0}^{k}S(k,l)*l! \sum\limits_{j=1}^{N}C_{dis(t,j)}^{l} \)
然后开始把那个 C 拆开什么的。最后去看题解了。
原来那个 C 已经可以树形DP算了。设 \( f[ i ][ j ] = \sum\limits_{k=1}^{N}C_{dis(i,k)}^{j} \) ,由 \( C_{i}^{j}=C_{i-1}^{j}+C_{i-1}^{j-1} \) 可以得到递推式(换根时):
\( f[i][j]-=f[v][j-1]+f[v][j] \) \( f[v][j]=f[i][j-1]+f[i][j] \) (其中 i 是现在的根, v 是下一次的根)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e4+,M=,mod=;
int n,m,hd[N],xnt,to[N<<],nxt[N<<];
int f[N][M],g[N][M],s[M][M],jc[M];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
void upd(int &x){x>=mod?x-=mod:;}
void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;}
void init()
{
jc[]=;for(int i=;i<=m;i++)jc[i]=jc[i-]*i%mod;
s[][]=;
for(int i=;i<=m;i++)
for(int j=;j<=i;j++)
s[i][j]=(s[i-][j]*j+s[i-][j-])%mod;
}
void cz(int *a,int *b,int fx)
{
a[]=(a[]+mod+b[]*fx)%mod;
for(int j=;j<=m;j++)
a[j]=(a[j]+(b[j-]+b[j])*fx)%mod+mod,upd(a[j]);
}
void dfs(int cr,int fa)
{
f[cr][]=;
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=fa)
{
dfs(v,cr);
cz(f[cr],f[v],);
}
memcpy(g[cr],f[cr],sizeof f[cr]);
}
void dfsx(int cr,int fa)
{
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=fa)
{
cz(g[cr],f[v],-);
cz(g[v],g[cr],);
dfsx(v,cr);
cz(g[cr],f[v],);
}
}
int main()
{
int L,now,A,B,Q,tmp,u,v;
scanf("%d%d%d",&n,&m,&L); init();
scanf("%d%d%d%d",&now,&A,&B,&Q);
for(int i=;i<n;i++)
{
now=(now*A+B)%Q;
tmp=(i<L)?i:L;
u=i-now%tmp; v=i+;
add(u,v); add(v,u);
}
dfs(,); dfsx(,);
for(int i=;i<=n;i++)
{
int ans=;
for(int j=;j<=m;j++)
ans=(ans+s[m][j]*jc[j]%mod*g[i][j])%mod;
printf("%d\n",ans);
}
return ;
}
UPD(2018.12.16):今天讲到 hdu 4625 ,竟然完全不记得做过。于是又打了一遍。hdu 交上去总是 CE ,重打了一遍 init( ) 里的括号就好了。难道是什么中文括号之类的?
不过今天讲的是另一种想法,维护 x 的 n 次下降幂之类的。不管了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=5e4+,M=,mod=;
int T,n,m,hd[N],xnt,to[N<<],nxt[N<<];
int S[M][M],jc[M],f[N][M],ans[N];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
void upd(int &x){while(x>=mod)x-=mod;while(x<)x+=mod;}
void init()
{
int lm=;
S[][]=;
for(int i=;i<=lm;i++)
for(int j=;j<=i;j++)
S[i][j]=(S[i-][j-]+(ll)S[i-][j]*j)%mod;
jc[]=;for(int i=;i<=lm;i++)jc[i]=(ll)jc[i-]*i%mod;
}
void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;}
void add(int *a,int *b,int k)
{
a[]+=b[]*k;
for(int j=;j<=m;j++)
a[j]+=(b[j-]+b[j])*k,upd(a[j]);
}
void dfs(int cr,int fa)
{
f[cr][]=;
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=fa)
{
dfs(v,cr);add(f[cr],f[v],);
}
}
void dfsx(int cr,int fa)
{
ans[cr]=;
for(int i=;i<=m;i++)
ans[cr]=(ans[cr]+(ll)jc[i]*S[m][i]%mod*f[cr][i])%mod;
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=fa)
{
add(f[cr],f[v],-);
add(f[v],f[cr],);
dfsx(v,cr);
add(f[v],f[cr],-);
add(f[cr],f[v],);
}
}
int main()
{
T=rdn();init();
while(T--)
{
n=rdn();m=rdn();
xnt=;memset(hd,,sizeof hd);
for(int i=,u,v;i<n;i++)
u=rdn(),v=rdn(),add(u,v),add(v,u);
memset(f,,sizeof f);
dfs(,);dfsx(,);
for(int i=;i<=n;i++)printf("%d\n",ans[i]);
}
return ;
}
bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP的更多相关文章
- 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 ...
- 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 ...
随机推荐
- Gradle 引入本地定制 jar 包,而不使用坐标下载 jar 包的方法
第 1 步:创建文件夹,拷贝 jar 包 在自己的 Gradle 项目里建立一个名为 “libs” (这个名字可以自己定义,不一定非要叫这个名字)的文件夹,把自己本地的 jar 包拷贝到这个文件夹中. ...
- InfiniBand技术和协议架构分析
Infiniband开放标准技术简化并加速了服务器之间的连接,同时支持服务器与远程存储和网络设备的连接. IB技术的发展 1999年开始起草规格及标准规范,2000年正式发表,但发展速度不及Rapid ...
- HTML5 ——web audio API 音乐可视化(一)
使用Web Audio API可以对音频进行分析和操作,最终实现一个音频可视化程序. 最终效果请戳这里; 完整版代码请戳这里,如果还看得过眼,请给一个start⭐ 一.API AudioContext ...
- jenkins 环境搭建与入门示例
环境说明: 1.win7 2.tomcat 9.0.0.M17 3.jenkins 2.32.2.war jenkins 环境搭建 1.下载jenkins部署包 https://jenkins.io/ ...
- [csharp] bool IsNumeric(Type type)
/* "C:\Program Files (x86)\MSBuild\14.0\Bin\csc.exe" /out:IsNumericType.exe IsNumericType. ...
- 三十八 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装
elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...
- iOS-沙盒路径
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.documents,tmp,app,Library.(NSHomeDirectory() ...
- 【spark】SparkSession的API
SparkSession是一个比较重要的类,它的功能的实现,肯定包含比较多的函数,这里介绍下它包含哪些函数. builder函数public static SparkSession.Builder b ...
- VS10x CodeMap
VS10x CodeMap 注册码(key): #$aCN/L/ra73OaqCJENXc2JIDL61IMawNWBBX+PxhBzobE9w3QlcrwoXeB3DWBC2f56y9r0Hx2XP ...
- Prism5.0新内容(纯汉语版)
Prism 5.0 包含很多新东西,新的快速入门示例,新的范例,更新的文档,Prism类库代码的改变.用来解决已有问题,回应社区所提的需求.(这句话跟 What's New in Prism Libr ...