专栏文章
题解:CF1172B Nauuo and Circle
CF1172B题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqlvcfs
- 此快照首次捕获于
- 2025/12/04 06:55 3 个月前
- 此快照最后确认于
- 2025/12/04 06:55 3 个月前
首先,观察样例,发现真正不同的只有 4 个, 也就是圆心正上方的数是 1 的情况,剩下的都是旋转得到的。所以以 为根讨论,最后输出 。
手玩一下,发现连边就会将各个子树隔绝,所以一个子树的排布是要连续的。而且所有的子树,最终是不会留下空位的。
我们定义 为以 u 为根的子树的方案数,有 个子树。那么它们可以随意排列,贡献就是 ,每个子树的方案数也是独立的。所以有:
我们已经把节点 固定了,没有考虑 节点,如果不是根的话,节点 也可以和它的子树一起排列,这种情况下,上面式子的 要变成 。
CPP#include<bits/stdc++.h>
using namespace std;
constexpr int N = 2e5+10, mod = 998244353;
int fac[N],n;
vector<int>e[N];
int f[N];
void dfs(int u,int fa) {
f[u] = fac[e[u].size()];
for(int v:e[u]) {
if(v == fa) continue;
dfs(v,u);
f[u] = 1ll * f[u] * f[v] % mod;
}
}
int main() {
cin>>n;
fac[0] = 1;
for(int i=1;i<=n;i++) fac[i] = 1LL * fac[i-1] * i % mod;
for(int i=1,u,v;i<n;i++) cin>>u>>v, e[u].push_back(v), e[v].push_back(u);
dfs(1,1);
cout << 1ll * f[1] * n % mod;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...