CF512D Fox And Travelling(DP 计数)

CF512D Fox And Travelling

给定一张 \(n\) 个点 \(m\) 条边的无向图,每次选择一个叶子结点并将它和连接它的边删除。

对于每个 \(k\in[0,n]\),问有序选择 \(k\) 个点的方案数。

\(n\le 100\)

显然如果有环,那么所有环上的点都无法被选择,可以选择的只是一棵棵树。

按照是否有环,可以将所有树分为两类,求出每一棵树的答案,再背包乘起来:

  • 一棵单独的树,可以被取完,从各个方向都可以选择,直接背包计算即可。
  • 树根连在“环”上,只可以从儿子向上取。
    • \(\color{yellow}{\bigstar\texttt{Trick}}\):按照上面的方法,将每个点当做根节点做一遍。设树的大小为 \(n\),发现每种选择 \(k\) 个点的情况都会在 \(n-k\) 个点中计算一遍,那么答案除 \(n-k\) 即可。

将长度为 \(l_1,l_2\) 的序列合并起来的方案数为 \(\binom{l_1+l_2}{l_1}\),那么直接用背包合并即可。

#define Maxn 105
#define Maxm 10005
#define mod 1000000009
int n,m,tot,cnt;
int C[Maxn][Maxn],ind[Maxn];
int hea[Maxn],nex[Maxm<<1],ver[Maxm<<1];
bool Covered[Maxn];
vector<int> g[Maxn];
inline void add(int x,int y){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot; }
inline ll ksm(ll x,ll y=mod-2)
{ll ret=1;for(;y;y>>=1,x=x*x%mod) if(y&1) ret=ret*x%mod;return ret;
}
struct TREE
{int opt,rt,sall,siz[Maxn];ll dp[Maxn],tmp[Maxn][Maxn];void dfs(int x,int fa){tmp[x][0]=1,siz[x]=0;for(int v:g[x]) if(v!=fa){dfs(v,x);for(int su=siz[x];su>=0;su--) for(int sv=1;sv<=siz[v];sv++)(tmp[x][su+sv]+=tmp[x][su]*tmp[v][sv]%mod*C[su+sv][sv]%mod)%=mod;siz[x]+=siz[v];}(tmp[x][siz[x]+1]+=tmp[x][siz[x]])%=mod;siz[x]++;}inline void ADD(int x){memset(tmp,0,sizeof(tmp)),dfs(x,0);for(int i=0;i<=sall;i++) (dp[i]+=tmp[x][i])%=mod;}void Find(int x,int fa) { ADD(x); for(int v:g[x]) if(v!=fa) Find(v,x); }void Count(int x,int fa) { sall++; for(int v:g[x]) if(v!=fa) Count(v,x); }void solve(){Count(rt,0);if(opt==0) { Find(rt,0); for(int i=0;i<sall;i++) dp[i]=dp[i]*ksm(sall-i)%mod; }else ADD(rt);}
}subtree[Maxn];
ll ans[Maxn];
int main()
{C[0][0]=1;for(int i=1;i<=100;i++){C[i][0]=1;for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}n=rd(),m=rd();for(int i=1,u,v;i<=m;i++)u=rd(),v=rd(),add(u,v),add(v,u),ind[u]++,ind[v]++;queue<int> q;for(int i=1;i<=n;i++) if(ind[i]<=1) q.push(i);while(!q.empty()){int cur=q.front(); q.pop();bool exist=false;Covered[cur]=true;for(int i=hea[cur];i;i=nex[i]){if(Covered[ver[i]]) g[cur].pb(ver[i]),g[ver[i]].pb(cur);else{exist=true,ind[ver[i]]--;if(ind[ver[i]]==1) q.push(ver[i]);}}if(!exist) cnt++,subtree[cnt].opt=0,subtree[cnt].rt=cur;}for(int i=1;i<=n;i++) if(!Covered[i])for(int j=hea[i];j;j=nex[j]) if(Covered[ver[j]])cnt++,subtree[cnt].opt=1,subtree[cnt].rt=ver[j];for(int i=1;i<=cnt;i++) subtree[i].solve();ans[0]=1;for(int i=1,pre=0;i<=cnt;i++){for(int su=pre;su>=0;su--) for(int sv=1;sv<=subtree[i].sall;sv++)(ans[su+sv]+=ans[su]*subtree[i].dp[sv]%mod*C[su+sv][su]%mod)%=mod;pre+=subtree[i].sall;}for(int i=0;i<=n;i++) printf("%lld\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理...

通过 ASP.NET Core&#xff0c;开发者可轻松配置和管理其应用的安全性。 ASP.NET Core 中包含管理身份验证、授权、数据保护、SSL 强制、应用机密、请求防伪保护及 CORS 管理等等安全方面的处理。 通过这些安全功能&#xff0c;可以生成安全可靠的 ASP.NET Core 应用。而我们这…

模板:左偏树

文章目录解析可以解决的问题定义&#xff1a;左偏树的基本性质基本结论操作合并访问与删除堆顶元素插入元素批量插入删除已知元素所谓左偏树&#xff0c;就是往左偏的树 下面介绍一下它的一个兄弟&#xff1a; 《右偏树》 &#xff08;逃&#xff09; 解析 所谓左偏树&#…

迎开学水题狂欢赛(舞踏会[dp+三叉树],HH去散步[矩阵快速幂],排序[模拟],铁路旅行[线段树])

快速简单记录老师口胡&#xff08;可能就我自己看得懂了吧…&#xff09; 文章目录T1&#xff1a;舞踏会titlesolutioncodeT2&#xff1a;HH去散步titlesolutioncodeT3&#xff1a;排序titlesolutioncodeT4&#xff1a;铁路旅行titlesolutioncodeT1&#xff1a;舞踏会 title …

P2619 [国家集训队]Tree I(K 度限制生成树 二分)

P2619 [国家集训队]Tree I 一张 \(n\) 个点 \(m\) 条边的带权无向联通图&#xff0c;每条边是黑色或白色。求一棵最小权的恰好有 \(need\) 条白色边的生成树&#xff0c;题目保证有解。 \(n\le 5\times 10^4,m\le 10^5,val\in[1,100]\)。 \(\color{yellow}{\bigstar\texttt{Tri…

CSP2021提高组复赛解析

前言 终于出成绩了我可以写博客辣&#xff0c;官方数据还没出就先放洛谷的题目链接了。 正题 T1-廊桥分配 https://www.luogu.com.cn/problem/P7913 题目大意 有m1m_1m1​种一类飞机&#xff0c;m2m_2m2​种二类飞机&#xff0c;每个飞机有一个占用时间的区间。要给两类飞机…

一起开心集训队第一周训练赛2021/3/14

文章目录比赛链接A CodeForces 1481D AB Graph题意&#xff1a;题解&#xff1a;代码&#xff1a;B CodeForces 1481E Sorting Books题意&#xff1a;题解&#xff1a;代码&#xff1a;C CodeForces 1478D Nezzar and Board题意&#xff1a;题解&#xff1a;代码&#xff1a;D …

9.27模拟:至暗时刻

黑暗使人清醒 前言 15pts 00150 总的来说&#xff0c;就是能切的没切掉&#xff0c;不该挂的分全挂了 呜呜呜 考场 先看题 有构造专题那味了 感觉题目都好奇怪啊… 似乎T1看起来相对比较水的样子 T2感觉可能是奇怪的模型&#xff0c;也许可做&#xff1f; T3这是甚么玩意。。…

使用Azure DevOps持续集成GitHub项目

点击蓝字关注我微软的Azure DevOps是一款软件开发管理工具&#xff0c;整合了需求、代码、编译、测试、发布等所有功能于一身。今天我们就来看看如何用Azure DevOps对自己GitHub上的项目做持续集成&#xff0c;并能在GitHub显示最新编译状态。其实在不久之前&#xff0c;Azure …

[BZOJ 3811]玛里苟斯(线性基)尽量理解的题解

文章目录titlesolutioncodetitle 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心&#xff0c;于是他想了一道数学题。 S 是一个可重集合&#xff0c;S{a1,a2,…,an}。 等概率随机取 S 的一个子集 A{ai1,…,aim}。 计算出 A 中所有元素异或和&#xff0c;记为 x, 求 x^…

CF464E The Classic Problem(线段树 最短路)

CF464E The Classic Problem \(\bigstar\texttt{Hint}\)&#xff1a;发现没有什么好的突破口&#xff1f;为什么不想想怎样才能实现题目中 \(2^x\) 的加减法呢&#xff1f; 可见每次加减法&#xff0c;我们要做的是将添加的 \(1\) 和右边的连续的 \(1\) 合并为一整段&#xff0…

9.28模拟

fuckingqytandAstaAKIOI\texttt{fucking qyt and Asta AK IOI}fucking qyt and Asta AK IOI 前言 200pts&#xff08;lemon&#xff09;01001000 340pts&#xff08;996&#xff09;10010010040 T4是lemon的数据锅掉了 T1本地洛谷996都能过&#xff0c;lemon蜜汁RE。。。 枯了…

C. Longest Simple Cycle

C. Longest Simple Cycle 题意&#xff1a; 有n条链&#xff0c;第i条链上有c[i]个点&#xff0c;a[i]为第i条链的顶点与第i-1条链的连接点&#xff0c;b[i]为第i条链的最后一个点与第i-1条链的连接点。通过上面的方法连接链会产生很多的环&#xff0c;问这些环的最大长度。 …

【CF813F】Bipartite Checking(线段树分治+可删除并查集)

文章目录titlesolutioncodetitle You are given an undirected graph consisting of n vertices. Initially there are no edges in the graph. Also you are given q queries, each query either adds one undirected edge to the graph or removes it. After each query you…

在.Net Core WebAPI下给Swagger增加导出离线文档功能

一丶前言最近刚接触到Swagger&#xff0c;在github上下载了它的源码和demo学习了一遍&#xff0c;发现这个组件非常好用&#xff0c;不过不足的是它没有导出离线文档的功能&#xff0c;于是乎我就想给它加一个导出功能Swagger Github开源地址二丶思路其实说白了api文档就是一个…

P7920-[Kubic]Permutation

正题 题目链接:https://www.luogu.com.cn/problem/P7920 题目大意 一个排列ppp生成的森林的形式如下&#xff0c;对于每个iii找到最大的j∈[1,i)j\in [1,i)j∈[1,i)满足 pi>pjp_i>p_jpi​>pj​&#xff0c;然后连一条i,ji,ji,j之间的边。 给出一张树GGG&#xff0c;…

YBTOJ洛谷P4331:数字序列(左偏树)

文章目录题目描述数据范围解析代码题目描述 数据范围 n<1e6n<1e6n<1e6 解析 先考虑简单情况 如果原数列是单调递增的&#xff0c;显然应该使biaib_ia_ibi​ai​ 如果单调递减&#xff0c;应该取中位数 那么原数列如果分成单调递减的几段&#xff0c;那么每一段都取中…

P8441 旭日东升(二维数点经典套路)

P8441 旭日东升 维护一个不可重集合的序列 \(a\)&#xff0c;长度为 \(n\)。支持以下两种操作&#xff1a; l r x 对于每个 \(l\le i\le r\)&#xff0c;将 \(x\) 并入 \(a_i\)。l r 设 \(S\) 把每个 \(l\le i\le r\) 的 \(a_i\) 并在一起的集合&#xff0c;输出 \(S\) 中所有元…

深搜、广搜、搜索剪枝

搜索与回溯讲解 文章目录深搜方向向量&#xff1a;DFS代码&#xff1a;题目讲解&#xff1a;八皇后问题字符序列自然数的拆分广搜BFS代码&#xff1a;题目讲解&#xff1a;瓷砖关系网络bfs与dfs的用途与区别搜索剪枝可行性剪枝最优性剪枝记忆化搜索搜索顺序剪枝题目&#xff1a…

使用logdashboard查看可视化日志

logdashboard日志面板是我在Github写的一个开源项目&#xff0c;旨在让查看日志变的方便快捷。在线预览现在功能有日志检索、趋势图、异常堆栈快速查看、日志详情等logdashboard支持自定义日志模型可以记录更多自定义的属性。logdashboard支持的日志来源有以下两种&#xff0c;…

CF1603C-Extreme Extension【整除分块,dp】

正题 题目链接:http://codeforces.com/contest/1603/problem/C 题目大意 定义一个序列aaa的f(a)f(a)f(a)为你每次可以将序列中的一个数zzz分裂成xyzxyzxyz&#xff0c;然后再把x,yx,yx,y放回原来的位置&#xff0c;然后f(a)f(a)f(a)表示把aaa变成不降序列的最少操作次数 给出…