Codeforces 1097G
根本想不到
题意
给出一棵树,定义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的更多相关文章
- Codeforces 1097G Vladislav and a Great Legend [树形DP,斯特林数]
洛谷 Codeforces 这题真是妙的很. 通过看题解,终于知道了\(\sum_n f(n)^k\)这种东西怎么算. update:经过思考,我对这题有了更深的理解,现将更新内容放在原题解下方. ...
- Codeforces 1097G - Vladislav and a Great Legend(第二类斯特林数+树上背包)
Codeforces 题目传送门 & 洛谷题目传送门 首先看到这题我的第一反应是:这题跟这题长得好像,不管三七二十一先把 \(k\) 次方展开成斯特林数的形式,\(f(X)^k=\sum\li ...
- CodeForces 1097G. Vladislav and a Great Legend
题目简述:给定$n \leq 10^5$个节点的树$T = (V, E)$,令$X \subseteq V$表示一个非空节点集合,定义$f(X)$为包含$X$的最小子树的边数.求 $$ \sum_{\ ...
- 学习总结:斯特林数( Stirling number )
基本定义 第一类斯特林数:$1 \dots n$的排列中恰好有$k$个环的个数:或是,$n$元置换可分解为$k$个独立的轮换的个数.记作 $$ \begin{bmatrix} n \\ k \end{ ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
随机推荐
- MySQL之初识数据库
一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...
- SQL FORMAT() 函数
FORMAT() 函数 FORMAT 函数用于对字段的显示进行格式化. SQL FORMAT() 语法 SELECT FORMAT(column_name,format) FROM table_nam ...
- Clion 配置
plugins: one dark theme font : fira code retina
- 关于wxpython多线程研究包括(import Publisher等错误研究)
作为一个自动化测试人员,开发基本的应用桌面程序是必须的!最近在研究wxpython相关知识,目前看到多线程一块,发现官方文档介绍说:"在线程中不能修改修改窗口属性!",但是实际情况 ...
- 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书)
3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP) 然后就是等着..... 假设可以了 咱呢是配置MQTT实现SSL安全加密通信,所以 ...
- FM算法解析及Python实现
1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...
- OCR技术浅析-无代码篇(1)
图像识别中最贴近我们生活的可能就是 OCR 技术了. OCR 的定义:OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打 ...
- 关于childNodes的删除
在使用childNodes时,发现需要删除的元素多于1时,会出现无法全部删除的情况.谷歌以后发现,该属性返回的子节点集合是实时更新的,也就是说,在for循环中,当删除第一个子节点之后,第二次删除的是原 ...
- Java语法----Java中equals和==的区别
[正文] 平时在学Android和Java语言的时候,总是碰到“equals”和“==”这两个字符,老感觉差不多:其实还是有一些区别的,今天干脆把它们彻底弄清楚. 一.java当中的数据类型和“==” ...
- mybatis源码分析(五)------------SQL的执行过程
在对SQL的执行过程进行分析前,先看下测试demo: /** * @author chenyk * @date 2018年8月20日 */ public class GoodsDaoTest { pr ...