链接:https://codeforces.com/contest/1097/problem/G
大概说一下题意吧:
一棵n个点的树,一个点集S的权值定义为把这个点集连成一个联通块的最少边数
求所有点集的 f ( S ) k f(S)^k f(S)k的和

对于这种带次方的,一般考虑两个方法
一个是二项式展开,一个是斯特林数展开
不知道斯特林数的可以看看这个第二类斯特林数
二项式展开我不是特别会用(虽然斯特林数也不会)
一开始是想用前者做的,但是发现不是很会写,并且二项式展开的话复杂度是稳定至少 O ( n k 2 ) O(nk^2) O(nk2)的。。并不可以通过
但是如果斯特林数可以和子树大小挂钩,那么复杂度就可以降为 O ( n k ) O(nk) O(nk)了

先把式子写成 a n s = ∑ i = 0 k { k i } i ! ∑ S ⊆ U ( f ( S ) i ) ans=\sum_{i=0}^k \begin{Bmatrix}k\\i\end{Bmatrix} i! \sum_{S⊆ U}\begin{pmatrix}f(S)\\i\end{pmatrix} ans=i=0∑k​{ki​}i!S⊆U∑​(f(S)i​)
你会发现,右边那个组合数的意义是,我们选择 i i i条边,对应多少个不同的点集
于是就可以考虑DP了
f i , j f_{i,j} fi,j​表示以i为根的子树,里面选择了 j j j条边,有多少种选点方案
转移的话
就是先把儿子的合并,然后加上自己的
当然,有两个条件是不合法的要减去
第一个是,子树外面没有选点,但是我们选了x到父亲这条边
第二个是,子树里面没有选点,但是我们选了x到父亲这条边
两个情况均要在DP的时候暴力去掉
但是在去掉第一个的时候,要小心,别把包括第二个也顺便去掉了

update 1.10
更新一下二项式展开的做法
本来就想用这个的。。但是我不是很会写。。忽然发现有代码可以抄借鉴,于是就爽快地抄写了一发
考虑DP, f i , j f_{i,j} fi,j​表示以 i i i为根, i i i这个点一定在范围内的边数的 j j j次方的答案
但是你发现,这个东西很不好转移,于是便有了另外一个状态
g i , j g_{i,j} gi,j​表示以 i i i为根, i i i这个点一定不在范围内的边数的 j j j次方的答案(但子树不为空)
那么我们就可以让i不管限制随便转移,随后减去 j j j就好了
容易发现 g g g的话,就是只选了一个儿子的和
至于有多少条边,我们可以发现边数=点数-1
因此,我们可以把父亲去掉,每一个点的贡献在合并到父亲的时候贡献就好了
具体来说,就是在合并到父亲的时候,先和一个全是1的数组二项式合并一下
然后再进行操作
和斯特林展开类似的,每次DP完都要去掉空子树的情况
然后就可以做到 n k 2 nk^2 nk2了
听说可以用NTT优化做到 n k l o g k nklogk nklogk。。但是由于常数巨大,且这题并不是NTT模数因此并不好实现,写个 n k 2 nk^2 nk2就溜了吧。。

CODE(斯特林的,二项式的在下面):

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const LL MOD=1e9+7;
const LL N=100005;
const LL K=205;
LL n,k;
struct qq
{LL x,y,last;
}e[N*2];LL num,last[N];
void init (LL x,LL y)
{num++;e[num].x=x;e[num].y=y;e[num].last=last[x];last[x]=num;
}
LL S[K][K];
LL JC[K];
LL h[K];
LL siz[N];
LL f[N][K];
LL g[N];
void dfs (LL x,LL fa)
{siz[x]=1;f[x][0]=2;for (LL xx=last[x];xx!=-1;xx=e[xx].last){LL y=e[xx].y;if (y==fa) continue;dfs(y,x);for (LL u=0;u<=min(siz[x]+siz[y]-1,k);u++) g[u]=0;for (LL u=0;u<siz[x]&&u<=k;u++)for (LL i=0;i<=siz[y]&&(u+i)<=k;i++)g[u+i]=(g[u+i]+f[x][u]*f[y][i]%MOD)%MOD;siz[x]=siz[x]+siz[y];for (LL u=0;u<=min(siz[x]-1,k);u++) f[x][u]=g[u];}if (x==1){for (LL u=0;u<=k;u++) h[u]=h[u]+f[x][u];}else{for (LL u=1;u<=k;u++) h[u]=(h[u]-f[x][u-1])%MOD;h[1]=(h[1]+1)%MOD;}for (LL u=k;u>=1;u--) f[x][u]=(f[x][u]+f[x][u-1])%MOD;f[x][1]=(f[x][1]-1+MOD)%MOD;
}
int main()
{num=0;memset(last,-1,sizeof(last));scanf("%lld%lld",&n,&k);JC[0]=1;for (LL u=1;u<=k;u++) JC[u]=JC[u-1]*u%MOD;S[0][0]=1;for (LL u=1;u<=k;u++)for (LL i=1;i<=u;i++)S[u][i]=(S[u-1][i-1]+S[u-1][i]*i%MOD)%MOD;for (LL u=1;u<n;u++){LL x,y;scanf("%lld%lld",&x,&y);init(x,y);init(y,x);}dfs(1,0);LL ans=0;for (LL u=0;u<=k;u++) ans=(ans+S[k][u]*JC[u]%MOD*h[u]%MOD)%MOD;ans=(ans+MOD)%MOD;printf("%lld\n",ans);return 0;
}
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL MOD=1e9+7;
const LL N=100005;
const LL K=205;
struct qq
{LL x,y,last;
}e[N];LL num,last[N];
LL n,k;
LL Pow[N];
void init (LL x,LL y)
{e[++num].x=x;e[num].y=y;e[num].last=last[x];last[x]=num;
}
LL f[N][K],g[N][K];
LL tmp[K];
LL siz[N];
LL C[K][K];
LL add (LL x,LL y)  {x=x+y;return x>=MOD?x-MOD:x;}
LL dec (LL x,LL y)  {x=x-y;return x<0?x+MOD:x;}
void dfs (LL x,LL fa)
{f[x][0]=2;siz[x]=1;for (LL u=last[x];u!=-1;u=e[u].last){LL y=e[u].y;if (y==fa) continue;dfs(y,x);for (LL i=0;i<=k;i++){tmp[i]=0;for (LL j=0;j<=i;j++)tmp[i]=add(tmp[i],C[i][j]*add(f[y][j],g[y][j])%MOD);}for (LL i=0;i<=k;i++) g[x][i]=add(g[x][i],tmp[i]);for (LL i=k;i>=0;i--)for (LL j=i;j>=0;j--)f[x][i]=add(f[x][i],C[i][j]*f[x][j]%MOD*tmp[i-j]%MOD);siz[x]=siz[x]+siz[y];f[x][0]=Pow[siz[x]];}for (LL u=0;u<=k;u++) f[x][u]=dec(f[x][u],g[x][u]);f[x][0]=dec(f[x][0],1);
}
int main()
{num=0;memset(last,-1,sizeof(last));scanf("%lld%lld",&n,&k);Pow[0]=1;for (LL u=1;u<=n;u++) Pow[u]=Pow[u-1]*2%MOD;C[0][0]=1;for (LL u=1;u<=k;u++){C[u][0]=1;for (LL i=1;i<=u;i++)    C[u][i]=add(C[u-1][i-1],C[u-1][i]);}for (LL u=1;u<n;u++){LL x,y;scanf("%lld%lld",&x,&y);init(x,y);init(y,x);}dfs(1,0);LL ans=0;for (LL u=1;u<=n;u++) ans=add(ans,f[u][k]);printf("%lld\n",ans);return 0;
}

[Codeforces1097G] Vladislav and a Great Legend相关推荐

  1. legend位置 pyecharts_实验|pyecharts数据可视化分析-1

    1. 实验介绍 本实验主要介绍pyecharts基本特点与属性. 1.1. 实验目的 了解pyecharts功能.特点.与安装方式. 1.2. 知识点 pyecharts特点 pyecharts图表 ...

  2. html中legend设置大小,HTML_如何给 legend 标签设定宽度,我们在做表单的时候经常会使 - phpStudy...

    如何给 legend 标签设定宽度 我们在做表单的时候经常会使用到这样的结构: 哪些浏览器legend标签设定的宽度有效 IE6 IE7 Firefox2 Firefox3 Opera9.0+ Saf ...

  3. 1.matlab 中的axis tight,legend

    (1)axis tight 使得图形框图靠近数据------未加tight 加了tight 之后的图形 (2)legend 函数 legend matlab_百度搜索 https://www.baid ...

  4. Matplotlib 放置legend(bbox_to_anchor)

    legend 是放置在我们的坐标边界里面的一个东西,主要的作用就是解释一下我们坐标轴里面的图形的含义(比如说针对x, y 对应的函数表达式,或者是曲线的意义(函数表达式)),legend 在英语里面的 ...

  5. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、为指定的子图添加图例信息(legend)

    Python使用matplotlib函数subplot可视化多个不同颜色的折线图.为指定的子图添加图例信息(legend) 目录

  6. R语言ggplot2可视化散点图、移除可视化图像中的多余的图例信息、使用scale_size函数移除数据点大小的图例(legend)

    R语言ggplot2可视化散点图.移除可视化图像中的多余的图例信息.使用scale_size函数移除数据点大小的图例(legend) 目录

  7. python使用matplotlib可视化线图(line plot)、将可视化图像的图例(legend)放置在图像外部、底部区域

    python使用matplotlib可视化线图(line plot).将可视化图像的图例(legend)放置在图像外部.底部区域(put legend outside and in bottom re ...

  8. python使用matplotlib可视化、为可视化图像添加图例(legend)、自定义图例的字体格式、字体大小、字体颜色等

    python使用matplotlib可视化.为可视化图像添加图例(legend).自定义图例的字体格式.字体大小.字体颜色等 目录

  9. R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据、并自定义因子(factor)的图例颜色legend

    R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据.并自定义因子(factor)的图例颜色legend(use heatmap to visuali ...

最新文章

  1. 咱们码农可以从曾国藩身上学到点什么呢?
  2. 关于使用wcf架构分布式系统的一点想法
  3. 如何将CSDN文档输出PDF文件?
  4. zabbix—自动发现端口并监控
  5. vue路由传参的三种基本方式 - 流年的樱花逝 - SegmentFault 思否
  6. 【Linux】【Services】【nfs】nfs安装与配置
  7. UVA - 133 ​​​​​​​The Dole Queue
  8. html条件查询的页面,如何在 url 中记录页面搜索条件
  9. python和java哪个好学-java和python哪个的前途更好?
  10. 手机编程环境初尝试-用AIDE开发Android应用
  11. 玩转Web之html+CSS(一)---论坛首页表格的实现
  12. linux smartctl 命令,在 CentOS 7 里用 smartctl 和 hdparm 对硬盘进行基本测试
  13. sh计算机c盘如何管理,c盘瘦身三种方法详解
  14. [Vue]鼠标悬停变色
  15. Surface Defect Detection Methods for Industrial Products : A Review
  16. 在html中div水平垂直css,html中div使用CSS实现水平/垂直居中的多种方式
  17. java web 下拉列表_关于web中下拉列表的几种实现方法
  18. php-fpm启动,重启,终止操作
  19. ANGULAR之中的$STATE、 $WATCH、 $SCOPE、 $ROOTSCOPE 分别是什么?
  20. RDMA send/recv 和 read/write操作

热门文章

  1. 华为鸿蒙系统是指芯片吗_华为鸿蒙系统究竟是什么情况?
  2. python 毫秒时间戳转日期
  3. 免费送!!!CSDN会员月卡!
  4. 24个基本指标精粹讲解(20)--BIAS
  5. 学计算机的需要买电脑键盘吗,事实:计算机学生需要购买机械键盘和显示器吗?...
  6. LV.11 嵌入式系统驱动初级
  7. idea退出首界面_IntelliJ IDEA项目的打开与关闭
  8. AndroidStudio检测不到手机设备
  9. 在javascript中如何根据周几进行油价优惠。
  10. 大数据挖掘与人工智能线上班课程