ZJOI 2017 仙人掌
题链
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 仙人掌相关推荐
- ZJOI 2017 线段树
这题并不难想,但是很难写. 首先先转化为开区间,然后一个就是挂左链,一个是挂右链. 然后变成了一个点与左链上挂的点的距离的问题. 然后就分讨吧! 此处省略一万字. 写完之后,编译了一下程序,电脑死机了 ...
- ZJOI 2017 DAY2 NGU
Day2在我们yyhs举行..很荣幸! 虽然听到看到一些dalao抱怨食堂/机房等地方不尽人意.. 但是我们会努力改进的! 周五的时候省选二试开展..我仍然是个juruo. T1:hanoi问题升升升 ...
- 2017.9.8 仙人掌图 失败总结
其实这个题思路还是挺简单的..一开始和正解只差了一个单调队列. 就是把他当成树dp处理,一开始想的拓扑序往上缩.但其实dfs就可以了.. 仙人掌的图就是由两部分构成.一个是桥.一个是环.所以对于桥我们 ...
- 腾讯 2017 年投资项目榜单 TOP 10,与阿里死磕到底?
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! [编者按]从社交.电商,再到娱乐.出行.文化.医疗.AR/VR.企业服务.线下零售等各个领域 ...
- 2017第九届广州国际园林机械与园艺工具展 2017第九届广州国际园林景观与美好人居博览会 第九届广州国际花卉盆栽及花店花园用品展览会 2017中国花卉展览会 第九届广州国际绿化苗木展会刊(参展商名录
2017第九届广州国际园林机械与园艺工具展 2017第九届广州国际园林景观与美好人居博览会 第九届广州国际花卉盆栽及花店花园用品展览会 2017中国花卉展览会 第九届广州国际绿化苗木展会刊(参展商名录 ...
- HAOI 2017 游记
省选 2017年4月23日 流水账式游记,不喜勿喷. Day0: 准备出发,上午敲了一顿板子,板子敲完了就打小游戏,老师也不管了. 过程中各种奶,说什么今年一定考仙人掌啦,今年一定考字符串啦,今年一定 ...
- ZJOI 2022 游记--zhengjun
前言 ZJOI 王朝复辟???... 这次比赛在 5 月 3 号和 4 号,由于 qz 教育局什么五一不调休,正常放完双休回来,刚好比赛的两天就是周二周三,还做好了回来隔离半个月的心理准备,这两天算不 ...
- 2017 年总结及 2018 年计划
概述 本文写于 2018.01.01,计划从 2017 开始有目的的进行复盘行动,所以将该文搬运到此处. ----------------------------分界线---------------- ...
- 2017 年已读书单总结
本文写于 2018-01-28 10:48:45,由于搬迁博客到 CSDN,故重新发布以保存历史记录. 2017 年 4 月由于换工作缘故,中间有点空闲时间,再加上新公司不是很忙,在闲暇之余看了几本书 ...
最新文章
- 安川机器人焊枪切换设定方法_安川机器人参数更改方法
- BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
- 帆软《商业智能》书籍首发,国产BI行业独家,福利发售!
- hdu-4080 Stammering Aliens 字符串hash 模板题
- MongoDB聚合(aggregate)常用操作及示例
- Simplify Path
- C#做小工具的时候碰到的问题
- 自然语言处理NLP星空智能对话机器人系列:理解语言的 Transformer 模型-子词分词器
- 【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)
- 详解Java的交互式编程环境:jshell
- 大数据产品概念和分类
- 简单对抗神经网络GAN实现与讲解-图片对抗
- Oracle + PlSql 下载安装配置
- FAT文件系统简明教程
- Typora保留文本格式
- Python学习笔记(一)(图灵学院)
- C语言的字符串的联接
- Kubernetes原生api部署微服务5-监听Pod
- opengl 画椭圆_如何画椭圆的共轭半径及其他......
- linux——awk(3):awk变量