题链

SOL: 一道很奇怪的计数题。

我们先考虑树的做法:

用h[i]表示有i个带匹配的子树,它们之间匹配的方案数

h[i]=h[i-1]+(i-1)*h[i-2]

  • 如果i子树不与其他子树相连,那么方案就是h[i−1]
  • 如果与其他子树连接,那么有(i−1)中选择方式,而当选择一个子树以后,有两个子树不能再连接,那么方案就是(i−1)∗h[i−2]

f[i]表示做完以i为根的子树,且没有路径可以向上扩展。 
  g[i]表示做完以i为根的子树,且有路径可以向上扩展。

 f[x]=Πg[son]×h[num]

 g[x]=f[x]+Πg[son]×h[num−1]×num

我们考虑仙人掌,我们发现环对答案没有贡献,将其删掉就好了。

那么变成了一片森林,就可以做了。

#include<bits/stdc++.h>
#define N 500107
#define M N<<2|1
#define mo 998244353
#define LL long long
using namespace std;
LL h[N]; int n,T,a,b,m;
void pre() {h[0]=1;for (int i=1;i<N;i++) h[i]=(h[i-1]+(i>1?h[i-2]*(i-1):0))%mo;
}
#define sight(c) ('0'<=c&&c<='9')
inline void read(int &x){static char c;for (c=getchar();!sight(c);c=getchar());for (x=0;sight(c);c=getchar())x=x*10+c-48;
}
void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('\n'); }
inline void writel(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar(' '); }
struct Node{#define eho(x) for(int i=head[x];i;i=net[i])#define v fall[i]LL ans,f[N],g[N];int s[N],top,tim,tot,vis[N],low[N],dfn[N],head[N],net[M],fall[M],catus,col[N];void clear(int n) { n=min(sizeof vis,(3+n)*(sizeof top));ans=1; memset(vis,0,n); top=0; tim=0;tot=1; memset(head,0,n); memset(col,0,n);memset(dfn,0,n),memset(low,0,n); catus=0;}void init() {ans=1; memset(vis,0,sizeof vis); top=0; tim=0;tot=1; memset(head,0,sizeof head); memset(col,0,sizeof col);memset(dfn,0,sizeof dfn),memset(low,0,sizeof low); catus=0;}inline void add(int x,int y){fall[++tot]=y; net[tot]=head[x]; head[x]=tot;}inline void adds(int x,int y) {add(x,y); add(y,x);}void Tarjan(int x,int fa){dfn[x]=low[x]=++tim;s[++top]=x;bool flag=0;eho(x) if (v!=fa) {if (!dfn[v])  { Tarjan(v,x); low[x]=min(low[x],low[v]);if (low[v]<dfn[x]) {if (flag) {catus=1;return;}flag|=1;}} else {low[x]=min(low[x],dfn[v]);if (dfn[v]<dfn[x]) {if (flag) {catus=1;return;}flag|=1;    }}}if (dfn[x]==low[x]) do col[s[top--]]=x; while (s[top+1]!=x);}void dfs(int x,int fa){vis[x]=1;f[x]=1; g[x]=0;int num=0;eho(x) {if (col[x]==col[v]||fa==v) continue;dfs(v,x);f[x]=f[x]*g[v]%mo;num++;}g[x]=f[x]*h[num]%mo+f[x]*h[num-1]%mo*num%mo;f[x]=f[x]*h[num]%mo;}inline LL work() {Tarjan(1,0);if (catus) return 0;for (int i=1;i<=n;i++) if (!vis[i]) {dfs(i,0); ans=ans*f[i]%mo;} return ans;}
}G;int NN;
signed main () {freopen("a.in","r",stdin);freopen("a.out","w",stdout);read(T); pre(); G.init();while (T--) {read(n); read(m); //NN=max(n,m);while (m--) read(a),read(b),G.adds(a,b);writeln(G.work());G.clear(n);} return 0;
}

转载于:https://www.cnblogs.com/rrsb/p/8538965.html

ZJOI 2017 仙人掌相关推荐

  1. ZJOI 2017 线段树

    这题并不难想,但是很难写. 首先先转化为开区间,然后一个就是挂左链,一个是挂右链. 然后变成了一个点与左链上挂的点的距离的问题. 然后就分讨吧! 此处省略一万字. 写完之后,编译了一下程序,电脑死机了 ...

  2. ZJOI 2017 DAY2 NGU

    Day2在我们yyhs举行..很荣幸! 虽然听到看到一些dalao抱怨食堂/机房等地方不尽人意.. 但是我们会努力改进的! 周五的时候省选二试开展..我仍然是个juruo. T1:hanoi问题升升升 ...

  3. 2017.9.8 仙人掌图 失败总结

    其实这个题思路还是挺简单的..一开始和正解只差了一个单调队列. 就是把他当成树dp处理,一开始想的拓扑序往上缩.但其实dfs就可以了.. 仙人掌的图就是由两部分构成.一个是桥.一个是环.所以对于桥我们 ...

  4. 腾讯 2017 年投资项目榜单 TOP 10,与阿里死磕到底?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! [编者按]从社交.电商,再到娱乐.出行.文化.医疗.AR/VR.企业服务.线下零售等各个领域 ...

  5. 2017第九届广州国际园林机械与园艺工具展 2017第九届广州国际园林景观与美好人居博览会 第九届广州国际花卉盆栽及花店花园用品展览会 2017中国花卉展览会 第九届广州国际绿化苗木展会刊(参展商名录

    2017第九届广州国际园林机械与园艺工具展 2017第九届广州国际园林景观与美好人居博览会 第九届广州国际花卉盆栽及花店花园用品展览会 2017中国花卉展览会 第九届广州国际绿化苗木展会刊(参展商名录 ...

  6. HAOI 2017 游记

    省选 2017年4月23日 流水账式游记,不喜勿喷. Day0: 准备出发,上午敲了一顿板子,板子敲完了就打小游戏,老师也不管了. 过程中各种奶,说什么今年一定考仙人掌啦,今年一定考字符串啦,今年一定 ...

  7. ZJOI 2022 游记--zhengjun

    前言 ZJOI 王朝复辟???... 这次比赛在 5 月 3 号和 4 号,由于 qz 教育局什么五一不调休,正常放完双休回来,刚好比赛的两天就是周二周三,还做好了回来隔离半个月的心理准备,这两天算不 ...

  8. 2017 年总结及 2018 年计划

    概述 本文写于 2018.01.01,计划从 2017 开始有目的的进行复盘行动,所以将该文搬运到此处. ----------------------------分界线---------------- ...

  9. 2017 年已读书单总结

    本文写于 2018-01-28 10:48:45,由于搬迁博客到 CSDN,故重新发布以保存历史记录. 2017 年 4 月由于换工作缘故,中间有点空闲时间,再加上新公司不是很忙,在闲暇之余看了几本书 ...

最新文章

  1. 安川机器人焊枪切换设定方法_安川机器人参数更改方法
  2. BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
  3. 帆软《商业智能》书籍首发,国产BI行业独家,福利发售!
  4. hdu-4080 Stammering Aliens 字符串hash 模板题
  5. MongoDB聚合(aggregate)常用操作及示例
  6. Simplify Path
  7. C#做小工具的时候碰到的问题
  8. 自然语言处理NLP星空智能对话机器人系列:理解语言的 Transformer 模型-子词分词器
  9. 【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)
  10. 详解Java的交互式编程环境:jshell
  11. 大数据产品概念和分类
  12. 简单对抗神经网络GAN实现与讲解-图片对抗
  13. Oracle + PlSql 下载安装配置
  14. FAT文件系统简明教程
  15. Typora保留文本格式
  16. Python学习笔记(一)(图灵学院)
  17. C语言的字符串的联接
  18. Kubernetes原生api部署微服务5-监听Pod
  19. opengl 画椭圆_如何画椭圆的共轭半径及其他......
  20. linux——awk(3):awk变量

热门文章

  1. 光传输-ROADM技术总结
  2. 计算机基础知识试题及答案(二),计算机基础知识试题以及答案(二)
  3. Android StatusBar / NavigationBar
  4. 【深入浅出PyTorch】6-进阶训练技巧
  5. Linux数独小游戏C语言,C语言实现数独游戏的求解
  6. NUPT- DFS 算法题1047
  7. 什么是新闻源?发布新闻有哪些好处?
  8. SQLite数据库基本操作
  9. Pycharm创建SQLite数据库
  10. 别再自己手动抠图了,教你你用Python5行代码实现批量抠图