一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
二、解题报告
1、思路分析
考虑怎么放置这棵树不会存在交叉?
每颗子树存放区间都是连续区间(这个可以画图试一下)
那么我们把每个子树放到一个大小固定的盒子中,我们只需要决定盒子顺序和盒内顺序即可
对于每个结点而言其子树个数为度数 - 1
那么我们的总方案数就是 n * d[1] * d[2] * ... * d[n]
前面乘n是因为根的位置有n种
2、复杂度
时间复杂度: O(N)空间复杂度:O(N)
3、代码详解
#include <bits/stdc++.h>
#define sc scanf
using i64 = long long;
using PII = std::pair<int, int>;
constexpr int inf32 = 1e9 + 7;
constexpr i64 inf64 = 1e18 + 7;
constexpr int P = 998244353;
// #define DEBUG
void solve()
{
int n;
std::cin >> n;
int ans = n;
std::vector<int> d(n, 1);
for (int i = 1, u, v; i < n; ++ i) {
std::cin >> u >> v;
-- u, -- v;
ans = 1LL * ans * d[u] % P * d[v] % P;
++ d[u], ++ d[v];
}
std::cout << ans;
}
int main()
{
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
int _ = 1;
// std::cin >> _;
while (_--)
solve();
return 0;
}