题意:
\(n\)个点,问可以构造出多少个可以完美实现两两匹配的个数,结果取模
思路:
首先,奇数为0,偶数才有可能,先把n个点两两进行匹配,观察得出2 -> 1, 4 -> 1 * 3, 6 -> 1 * 3 * 5, 所以猜想n个点,有1 * 3 * 5 * \(\dots\) * n - 1
其次,可以把两个点看成一个大点,然后,考虑这样能够构造出多少棵树,根据cayley公式,数量为m ^ (m - 2)
再次,每个大节点有4中连接方法,还有4 ^ (m - 1)个
所以,答案就是上述相乘
总结:
cayley公式,m个点,能够成的树的数量为m ^ (m - 2)
点击查看代码
#include <bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(false);
using namespace std;
typedef long long ll;
const ll MOD = 998244353;
const ll MAXN = 1e6 + 10;
ll n;
ll c[MAXN];
ll quick_pow(ll base, ll power)
{
ll ans = 1;
while (power)
{
if (power & 1)
ans = ans * base % MOD;
base = base * base % MOD;
power >>= 1;
}
return ans;
}
void init()
{
c[2] = 1;
for (ll i = 4; i < MAXN; i += 2)
c[i] = (i - 1) * c[i - 2] % MOD;
}
int main()
{
IOS; cin.tie(0), cout.tie(0);
init();
cin >> n;
if (n & 1)
cout << "0" << endl;
else if (n == 2)
cout << "1" << endl;
else
{
ll ans = c[n] * quick_pow(4ll, n / 2 - 1) % MOD * quick_pow(n / 2, n / 2 - 2) % MOD;
cout << ans << endl;
}
return 0;
}