// 直径 * N TLE #include #include using namespace std; using ll = long long; using pii = pair; using pll = pair; using vi = vector; using vl = vector; #define rep3(i, a, b, c) for (ll i = (a); i < (b); i += (c)) #define rep2(i, a, b) rep3(i, a, b, 1) #define rep1(i, n) rep2(i, 0, n) #define rep0(n) rep1(aaaaa, n) #define ov4(a, b, c, d, name, ...) name #define rep(...) ov4(__VA_ARGS__, rep3, rep2, rep1, rep0)(__VA_ARGS__) #define per(i, a, b) for (ll i = (a) - 1; i >= (b); i--) #define fore(e, v) for (auto &&e : v) #define all(a) begin(a), end(a) #define sz(a) (int)(size(a)) template bool chmax(T &a, const S &b) { return a < b ? a = b, 1 : 0; } struct _ { _() { cin.tie(0)->sync_with_stdio(0), cout.tie(0); } } __; using ai3 = array; using ai5 = array; using mint = atcoder::modint998244353; // a bit[j - 1]) { swap(bit[j], bit[j - 1]); } } } }; bitsort(abit), bitsort(bbit); rep(i, 5) { if (abit[i] > bbit[i]) return true; if (abit[i] < bbit[i]) return false; } return false; } int main() { int N; cin >> N; vector G(N); rep(N - 1) { int U, V; cin >> U >> V; --U, --V; G[U].push_back(V); G[V].push_back(U); } auto bfs = [&](vi &look, vi &par, const vi &start) { fill(all(par), -1); look.clear(); look.reserve(N); for (int i : start) { par[i] = i; look.push_back(i); } int l = 0; while (l < N) { int v = look[l++]; for (int u : G[v]) { if (par[u] == -1) { par[u] = v; look.push_back(u); } } } }; vi dist, par(N); bfs(dist, par, vi(1, 0)); int d1 = dist.back(); bfs(dist, par, vi(1, d1)); int d2 = dist.back(); vi diameter; diameter.reserve(N); int t = d2; do { diameter.push_back(t); } while (t == par[t] ? 0 : (t = par[t], 1)); vi depth(N); ai3 ansd{0, 0, 0}; t = 0; for (int i : diameter) { bfs(dist, par, vi(1, i)); reverse(all(dist)); fill(all(depth), 0); for (int i : dist) { if (par[i] != i) chmax(depth[par[i]], depth[i] + 1); else break; } vi nowd(2); for (auto d : G[i]) { nowd.push_back(depth[d] + 1); } sort(all(nowd), greater()); ai3 now{nowd[0], nowd[1], nowd[2]}; if (greater_check(ansd, now)) ansd = now; t++; } mint ans = mint(2).pow(N + 2); int K = 0; rep(i, 3) K += ansd[i]; ans -= mint(2).pow(N - K - 1) * (mint(2).pow(ansd[0] + 2) + mint(2).pow(ansd[1] + 2) + mint(2).pow(ansd[2] + 2) - 6); cout << ans.val() << '\n'; }