题解:AT_agc070_b [AGC070B] Odd Namori
很厉害的题。
对于
对于本题同理,我们考虑计算钦定若干个奇环的形态时,图
但是还有一个限制是“图
也有一种思路是我们最后的贡献是
2^x\red{0^y} ,然后这个东西可以转化为(\sum\binom x i 1^i)(\sum \binom y i (-1)^i) ,和上文中奇环带有系数1 ,偶环带有系数-1 ,然后转化为钦定意义下的问题是等价的。
假设我们钦定了点集
注意到原题中“图
简单解释一下,我们枚举
一件令人惊喜的事情是,
现在再来考虑加上原限制。对于这条限制我们同样考虑容斥,即钦定一个边集
剩余点数等于
我们统计原图上长为
// Such a destiny was not desired.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int mod = 998244353, N = 1e5 + 5;
namespace basic {
template<typename T>
inline int add(T x, T y) {return (x + y >= mod ? x + y - mod : x + y);}
template<typename T, typename... P>
inline int add(T x, P... y) {return add(x, add(y...));}
inline int dec(int x, int y) {return (x - y < 0 ? x - y + mod : x - y);}
inline void ad(int &x, int y) {x = add(x, y);}
inline void de(int &x, int y) {x = dec(x, y);}
inline int qpow(int a, int b) {
int r = 1;
while(b) {
if(b & 1) r = 1ll * r * a % mod;
a = 1ll * a * a % mod; b >>= 1;
}
return r;
}
inline int inv(int x) {return qpow(x, mod - 2);}
int fac[N], ifac[N];
inline void fac_init(int n = N - 1) {
fac[0] = 1;
for(int i = 1; i <= n; i++)
fac[i] = 1ll * fac[i - 1] * i % mod;
ifac[n] = inv(fac[n]);
for(int i = n - 1; i >= 0; i--)
ifac[i] = 1ll * ifac[i + 1] * (i + 1) % mod;
}
int invx[N];
inline void inv_init(int n = N - 1) {
invx[1] = 1;
for(int i = 2; i <= n; i++)
invx[i] = 1ll * (mod - mod / i) * invx[mod % i] % mod;
}
inline int binom(int n, int m) {
if(n < m || m < 0) return 0;
return 1ll * fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}
}
using namespace basic;
int Pow[N];
int n, p[N], d[N], s[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n;
Pow[0] = 1;
for(int i = 1; i <= n; i++) {
Pow[i] = (ll)Pow[i - 1] * (n - 1) % mod;
}
for(int i = 2; i <= n; i++) {
cin >> p[i];
d[i] = d[p[i]] + 1;
s[d[i]]++;
}
int ans = 0;
for(int i = n - 1; i >= 1; i--) {
s[i] += s[i + 1];
ad(ans, (ll)s[i] * Pow[n - i - 1] % mod * n % mod);
}
ad(ans, (ll)Pow[n - 1] * n % mod);
for(int i = 1; i <= n; i++) {
ad(ans, Pow[n - d[i] - 1]);
}
cout << ans << "\n";
}