题意:

给出一棵树。设\(E\)表示边集,\(V\)表示点集,\(S\)为\(V\)的一个子集。

\(f(S)=|(u,v)|(u,v)\in E \ \&\&\ u\in V\ \&\&\ v\in V\)。

求\(\displaystyle \sum_{S\subseteq V}f(S)^k\)对\(998244353\)取模的结果。

$n\leq100000,k\leq 10 $。

\

还是对二项式定理不是很熟悉啊。

处理这类和的\(k\)次方问题经常用到二项式定理。

\[\displaystyle (a+b)^k=\sum_{i=0}^k\binom{k}{i}a^ib^{k-i}
\]

于是对于每个\(i\in [0,k]\),我们都维护\(f_{v,i}\)表示\(v\)的子树中\(\displaystyle \sum_{S\subseteq T}f(S)^i\)。

转移的时候就\(k^2\)转移就行了。

特别地,我们让\(0^0=1\),方便转移。

当然也可以用斯特林数

\[\displaystyle
n^m=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}\binom{n}{i}i!
\]

我们有组合恒等式

\[\displaystyle
\binom{a+b}{k}=\sum_{i=0}^k\binom{a}{i}\binom{b}{k-i}
\]

然后就可以同样的\(k^2\)。

代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define N 100005
  4. using namespace std;
  5. inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
  6. const ll mod=998244353;
  7. ll ksm(ll t,ll x) {
  8. ll ans=1;
  9. for(;x;x>>=1,t=t*t%mod)
  10. if(x&1) ans=ans*t%mod;
  11. return ans;
  12. }
  13. int n,m,k;
  14. struct road {
  15. int to,nxt;
  16. }s[N<<1];
  17. int h[N],cnt;
  18. void add(int i,int j) {s[++cnt]=(road) {j,h[i]};h[i]=cnt;}
  19. ll f[N][2][15];
  20. ll g[2][15],H[2][15];
  21. ll c[15][15];
  22. void dfs(int v,int fr) {
  23. f[v][0][0]=f[v][1][0]=1;
  24. for(int i=h[v];i;i=s[i].nxt) {
  25. int to=s[i].to;
  26. if(to==fr) continue ;
  27. dfs(to,v);
  28. memset(g,0,sizeof(g));
  29. for(int j=0;j<=k;j++) {
  30. for(int q=0;q<=k-j;q++) {
  31. (g[0][j+q]+=c[j+q][j]*f[v][0][j]%mod*(f[to][0][q]+f[to][1][q]))%=mod;
  32. (g[1][j+q]+=c[j+q][j]*f[v][1][j]%mod*f[to][0][q])%=mod;
  33. }
  34. }
  35. memset(H,0,sizeof(H));
  36. for(int j=0;j<=k;j++) {
  37. for(int q=0;q<=k-j;q++) {
  38. (H[1][j+q]+=c[j+q][j]*f[v][1][j]%mod*f[to][1][q])%=mod;
  39. }
  40. }
  41. memcpy(f[v],g,sizeof(g));
  42. for(int j=k;j>=1;j--)
  43. for(int q=0;q<j;q++) (H[1][j]+=c[j][q]*H[1][q])%=mod;
  44. for(int j=0;j<=k;j++) (f[v][1][j]+=H[1][j])%=mod;
  45. }
  46. }
  47. int main() {
  48. n=Get(),m=Get(),k=Get();
  49. for(int i=0;i<=k;i++)
  50. for(int j=0;j<=i;j++)
  51. c[i][j]=(!j||i==j)?1:(c[i-1][j-1]+c[i-1][j])%mod;
  52. int a,b;
  53. for(int i=1;i<=m;i++) {
  54. a=Get(),b=Get();
  55. add(a,b),add(b,a);
  56. }
  57. dfs(1,0);
  58. cout<<(f[1][0][k]+f[1][1][k])%mod;
  59. return 0;
  60. }

【gdoi2018 day2】第二题 滑稽子图的更多相关文章

  1. 【gdoi2018 day2】第二题 滑稽子图(subgraph)(性质DP+多项式)

    题目大意 [gdoi2018 day2]第二题 滑稽子图(subgraph) 给你一颗树\(T\),以及一个常数\(K\),对于\(T\)的点集\(V\)的子集\(S\). 定义\(f(S)\)为点集 ...

  2. 05:统计单词数【NOIP2011复赛普及组第二题】

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...

  3. 常见面试第二题之什么是Context

    今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...

  4. 《学习OpenCV》练习题第五章第二题abc

    代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...

  5. 《学习OpenCV》练习题第四章第二题

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  6. CSDN挑战编程——《金色十月线上编程比赛第二题:解密》

    金色十月线上编程比赛第二题:解密 题目详情: 小强是一名学生, 同一时候他也是一个黑客. 考试结束后不久.他吃惊的发现自己的高等数学科目竟然挂了,于是他果断入侵了学校教务部站点. 在入侵的过程中.他发 ...

  7. NOIP2005-普及组复赛-第二题-校门外的树

    题目描述 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  8. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  9. test20181020 B君的第二题

    题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...

随机推荐

  1. [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...

  2. Itween 动画插件中 的画线

    1.首先在你的层次视图中创建所需的节点 ,节点的位置顺序排列 2.导入Itween 插件 1.可以直接从项目外部拖拽到本项目中 2.通过AssetStore 中导入 3.在你的父节点上创建脚本 ,对象 ...

  3. 洛谷P1333 瑞瑞的木棍(欧拉回路)

    题目描述 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这些木棍连在一起拼成一条线,并且使得木棍与木棍相接触的两端颜色都是相同的,给出每根木棍两端的颜色,请问 ...

  4. mybatis 自动生成文件配置

    maven 依赖配置: <!-- sql server --><dependency> <groupId>com.microsoft.sqlserver</g ...

  5. 微信小程序心得

    首先从官方文档给的框架说起,微信小程序官方文档给出了app.js, app.json, app.wxss. 先从这三个文件说起. - app.js 这个文件是整个小程序的入口文件,开发者的逻辑代码在这 ...

  6. SuperMap-iServer过滤请求返回值

    目的: iServer发布的arcgis地图服务中,由于tileinfo参数为null,导致用arcgis-ios客户端开发的APP闪退.通过过滤器将get请求的返回值修改 代码: package c ...

  7. mysql数据库表操作-表的主键索引和普通索引

    数据库索引就象书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件时可以加快查询数据的速度.查询数据库,按主键查询是最快的,每个表只能有一个主键列,但是可以有多个普通索引列,主键列要求列的所有 ...

  8. Hibernate概念初探

    概述 Hibernate是一个开源代码的对象关系映射(ORM)框架,是基于Java的持久化中间件,它对JDBC进行轻量级的对象封装. 它不仅提供了从Java类到数据表之间的映射,也提供了查询和事务机制 ...

  9. Python 基于Python从mysql表读取千万数据实践

    基于Python 从mysql表读取千万数据实践   by:授客 QQ:1033553122 场景:   有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...

  10. Git 常用命令及操作总结

    Git常用命令及操作总结 By:授客 QQ:1033553122 利用TortoiseGit克隆源码库到本地 1.安装TortoiseGit 2.打开Git,进入到源码库,点击图示红色选框框选按钮,弹 ...