题面

给出一棵n个点的树,要求把它画在圆上,且边不相交,画法与排列一一对应(即旋转后相同的算不同种),求方案数。如下图是4个点的树\(T:V=\{1,2,3,4\},E=\{(1,2),(1,3),(2,4)\}\)的方案:

图片来自cf原题

分析

对于x的子树,我们发现x的子树上的节点在圆上一定是一个连续区间,否则会出现下图的情况

设deg[x]表示x的度数

对于非根节点x:

x有deg[x]-1个儿子,这些儿子排列的方案有\((deg[x]-1)!\)种,然后把根节点插到儿子与儿子相邻的任意一个位置,一共deg[x]个空,总答案为\((deg[x]-1)! \times deg[x]=deg[x]!\)

对于根节点x:

x本身的位置可以在圆上任选,有n种.x有deg[x]个儿子,排列方案为\(n \times deg[x]!\)

因此,总方案数为\(n \times\prod_{i=1}^n deg(i)!\)

代码

#include<iostream>
#include<cstdio>
#define maxn 200005
#define mod 998244353
using namespace std;
int n;
long long fact[maxn];
int deg[maxn]; int main(){
int u,v;
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d %d",&u,&v);
deg[u]++;
deg[v]++;
}
fact[0]=1;
for(int i=1;i<=n;i++){
fact[i]=fact[i-1]*i%mod;
}
long long ans=1;
for(int i=1;i<=n;i++){
ans*=fact[deg[i]];
ans%=mod;
}
ans*=n;
ans%=mod;
printf("%I64d\n",ans);
}

最新文章

  1. 繁星——jquery的data()方法
  2. input中加入搜索图标
  3. Safari中的new Date()格式化坑
  4. .NET 4.0 使用 asyn await
  5. visifire 图表双坐标轴 silverlight
  6. 改良版的SQL Service 通用存储过程分页
  7. 学习笔记3-开发与运行(卸载)第一个ANDROID应用
  8. 海康相机SDK二次开发只有视频无声音问题
  9. JAVA中使用Log4j2日志和Lombok引入日志的方法
  10. 【Python】脚本运行报错:IndentationError: unindent does not match any outer indentation level
  11. web:频繁刷新浏览器的页面【小工具】
  12. 关于DFS和BFS的理解 以及坐标的定义
  13. Python isnumeric() 方法
  14. PAT 1007 素数对猜想 C语言
  15. NET Core 应用程序 IIS 运行报错 502.3-Gateway
  16. 转:介绍几个著名的实用的Java反编译工具,提供下载
  17. Linux开机启动文件rc.local无法执行怎么办?
  18. mac下源码安装redis
  19. java环信服务端注册IM代码
  20. 问题 A: Least Common Multiple

热门文章

  1. 浅谈原生JavaScript的动画和特效
  2. CentOS安全防护实例
  3. Codeforces917E
  4. VPS 安装MySQL
  5. loj6038「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT
  6. [luogu] P3809 【模板】后缀排序 (SA)
  7. pypi 清华镜像使用帮助
  8. linux运维、架构之路-数据库迁移
  9. Python_011(生成器)
  10. 【HDOJ6699】Block Breaker(模拟)