根本想不到

CF1097G


题意

给出一棵树,定义f(S)为用最少的边连通点集$ S$的边数

求$ \sum\limits f(S)^k$

$ n \leq 10^5 k \leq 200$


题解

假设$ k=1$有一个清真的树形$ DP$

在点集的$ LCA$处统计答案即可

对于$ k>1$根据二项式定理

可以$ O(nk^2)$完成转移

但这是过不去的

考虑

$$ x^k=\sum_{i=0}^k \binom{x}{i}S(k,i)i!$$

其中$ S(i,j)$表示第二类斯特林数

拆开组合数得

$$ x^k=\sum_{i=0}^k \frac{x!}{(x-i)!}S(k,i)$$

因此我们只要维护所有的下降幂就可以还原出$ x^k$

诶等等...这复杂度还是$ nk^2$的啊...

冷静分析一下,假设当前选取的边集大小不超过$ k$那下降幂为$ 0$

因此我们只需要枚举到$ min(当前非0下降幂的长度,k)$即可

根据树上背包的复杂度分析,其实是$ O(nk)$的


代码

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define p 1000000007
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x=;char zf=;char ch=getchar();
while(ch!='-'&&!isdigit(ch))ch=getchar();
if(ch=='-')zf=-,ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();return x*zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt;
vector<int>e[];
int S[][],f[][],mi[],sz[],ans[];
void dfs(int x,int pre){
f[x][]=sz[x]=;
for(auto v:e[x])if(v!=pre){
dfs(v,x);
for(rt i=min(sz[v]-,k-);i>=;i--){
int val=f[v][i];
if(!i)val=1ll*val*(-mi[sz[v]])%p;
(ans[i+]+=1ll*val*(-mi[n-sz[v]])%p)%=p;
(f[v][i+]+=val)%=p;
}
for(rt i=min(sz[x]-,k);i>=;i--)
for(rt j=;j<=sz[v]&&i+j<=k;j++){
const int val=1ll*f[x][i]*f[v][j]%p;
if(i)(ans[i+j]+=val)%=p;
(f[x][i+j]+=val)%=p;
}
sz[x]+=sz[v];
}
}
#define inv2 500000004
int main(){
n=read(),k=read();
S[][]=;
for(rt i=;i<=k;i++)
for(rt j=;j<=i;j++)S[i][j]=(S[i-][j-]+1ll*S[i-][j]*j%p)%p;
for(rt i=;i<n;i++){
x=read();y=read();
e[x].push_back(y);
e[y].push_back(x);
}
mi[]=;
for(rt i=;i<=n;i++)mi[i]=1ll*mi[i-]*inv2%p;
dfs(,);
int ret=,jc=;
for(rt i=;i<=k;i++)(ret+=1ll*S[k][i]*jc%p*ans[i]%p)%=p,jc=1ll*jc*(i+)%p;
for(rt i=;i<=n;i++)ret=2ll*ret%p;
cout<<(ret+p)%p;
return ;
}

Codeforces 1097G的更多相关文章

  1. Codeforces 1097G Vladislav and a Great Legend [树形DP,斯特林数]

    洛谷 Codeforces 这题真是妙的很. 通过看题解,终于知道了\(\sum_n f(n)^k​\)这种东西怎么算. update:经过思考,我对这题有了更深的理解,现将更新内容放在原题解下方. ...

  2. Codeforces 1097G - Vladislav and a Great Legend(第二类斯特林数+树上背包)

    Codeforces 题目传送门 & 洛谷题目传送门 首先看到这题我的第一反应是:这题跟这题长得好像,不管三七二十一先把 \(k\) 次方展开成斯特林数的形式,\(f(X)^k=\sum\li ...

  3. CodeForces 1097G. Vladislav and a Great Legend

    题目简述:给定$n \leq 10^5$个节点的树$T = (V, E)$,令$X \subseteq V$表示一个非空节点集合,定义$f(X)$为包含$X$的最小子树的边数.求 $$ \sum_{\ ...

  4. 学习总结:斯特林数( Stirling number )

    基本定义 第一类斯特林数:$1 \dots n$的排列中恰好有$k$个环的个数:或是,$n$元置换可分解为$k$个独立的轮换的个数.记作 $$ \begin{bmatrix} n \\ k \end{ ...

  5. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  6. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  7. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  8. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  9. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

随机推荐

  1. 用CMD打开chrome并导航到百度(golang)

    首选在cmd中输入(注意:根据你的电脑路径修改,可能是Progra~1): C:\Progra~\Google\Chrome\Application\chrome.exe www.baidu.com ...

  2. day17-异常处理

    今天的内容比较少,只是单独的异常处理 开始今日份整理 1.异常 定义:异常时错误发生的信号,一旦出错,并且程序没有处理这个错误,就会抛出异常,并且程序会运行中止 2.异常的分类 2.1语法错误:pyt ...

  3. 23 python初学(模块和包)

    模块(module): 好处: 提高代码可维护性 + 编写代码不必从零开始 模块有三种: python标准库.第三方模块.应用程序自定义模块 另外,使用模块还可以避免函数名和变量名冲突,相同名字的函数 ...

  4. (五)Cluster Health

    Let’s start with a basic health check, which we can use to see how our cluster is doing. We’ll be us ...

  5. Java连接数据库,及增删改查

    自定义连接数据库的util类 package com.shuzf.jdbc; import java.sql.Connection; import java.sql.DriverManager; im ...

  6. L1-8 矩阵A乘以B (15 分)

    给定两个矩阵A和B,要求你计算它们的乘积矩阵AB.需要注意的是,只有规模匹配的矩阵才可以相乘.即若A有R​a​​行.C​a​​列,B有R​b​​行.C​b​​列,则只有C​a​​与R​b​​相等时,两 ...

  7. 在 .NET Core 中结合 HttpClientFactory 使用 Polly(上篇)

    译者:王亮作者:Polly 团队原文:http://t.cn/EhZ90oq 译者序一:前两天写了一篇文章 .NET Core 开源项目 Polly 介绍,在写这篇文章查看 Polly 资料时,看到了 ...

  8. python list 中 remove 的骚操作/易错点

    在过去的某一天(2019.3.19),有个学弟问了一个关于python list中的一个问题: 比如我们已知一个列表 [3,4,5,6,5,4,3] 我们想删除第一个为3的元素. 我们尝试了如下几种方 ...

  9. Git入门—创建项目

    Git入门—创建项目 注:win10系统下 打开Git Bash,进入存放仓库的目录 创建 初始化git init,该命令执行完后会在当前目录生成一个 .git 目录. 所有 Git 需要的数据和资源 ...

  10. iscroll.js实现上拉刷新,下拉加载更多,应用技巧项目实战

    上拉刷新,下拉加载更多...仿原生的效果----iscroll是一款做滚动效果的插件,具体介绍我就不废话,看官方文档,我只写下我项目开发的一些用到的用法: (如果不好使,调试你的css,想必是个很蛋疼 ...