Please sign in first.
Submission #28842803
Source Code Expand
#include <bits/stdc++.h> #define ENABLE_AVX2 using i32 = std::int32_t; using u32 = std::uint32_t; using i64 = std::int64_t; using u64 = std::uint64_t; using i128 = __int128_t; using u128 = __uint128_t; class Range { struct Iter { int itr; constexpr Iter(const int pos) noexcept : itr(pos) {} constexpr void operator++() noexcept { ++itr; } constexpr bool operator!=(const Iter& other) const noexcept { return itr != other.itr; } constexpr int operator*() const noexcept { return itr; } }; const Iter first, last; public: explicit constexpr Range(const int first, const int last) noexcept : first(first), last(std::max(first, last)) {} constexpr Iter begin() const noexcept { return first; } constexpr Iter end() const noexcept { return last; } }; constexpr Range rep(const int l, const int r) noexcept { return Range(l, r); } constexpr Range rep(const int n) noexcept { return Range(0, n); } template <class F> struct RecursiveLambda : private F { explicit constexpr RecursiveLambda(F&& f) : F(std::forward<F>(f)) {} template <class... Args> constexpr decltype(auto) operator()(Args&&... args) const { return F::operator()(*this, std::forward<Args>(args)...); } }; template <class F> constexpr decltype(auto) rec_lambda(F&& f) { return RecursiveLambda<F>(std::forward<F>(f)); } template <class T> constexpr T rem_euclid(T value, const T& mod) { assert(mod > 0); return (value %= mod) >= 0 ? value : value + mod; } template <class T> constexpr T totient(T x) { T ret = x; for (T i = 2; i * i <= x; ++i) { if (x % i == 0) { ret /= i; ret *= i - 1; while (x % i == 0) x /= i; } } if (x > 1) { ret /= x; ret *= x - 1; } return ret; } template <u32 MOD, std::enable_if_t<((u32)1 <= MOD and MOD <= ((u32)1 << 31))>* = nullptr> class StaticModint { using Self = StaticModint; static inline constexpr u32 PHI = totient(MOD); u32 v; public: static constexpr u32 mod() noexcept { return MOD; } template <class T, std::enable_if_t<std::is_integral_v<T>>* = nullptr> static constexpr T normalize(const T& x) noexcept { return rem_euclid<std::common_type_t<T, i64>>(x, MOD); } constexpr StaticModint() noexcept : v(0) {} template <class T> constexpr StaticModint(const T& x) noexcept : v(normalize(x)) {} template <class T> static constexpr Self raw(const T& x) noexcept { Self ret; ret.v = x; return ret; } constexpr u32 val() const noexcept { return v; } constexpr Self neg() const noexcept { return raw(v == 0 ? 0 : MOD - v); } constexpr Self inv() const noexcept { return pow(PHI - 1); } constexpr Self pow(u64 exp) const noexcept { Self ret(1), mult(*this); for (; exp > 0; exp >>= 1) { if (exp & 1) ret *= mult; mult *= mult; } return ret; } constexpr Self operator-() const noexcept { return neg(); } constexpr Self operator~() const noexcept { return inv(); } constexpr Self operator+(const Self& rhs) const noexcept { return Self(*this) += rhs; } constexpr Self& operator+=(const Self& rhs) noexcept { if ((v += rhs.v) >= MOD) v -= MOD; return *this; } constexpr Self operator-(const Self& rhs) const noexcept { return Self(*this) -= rhs; } constexpr Self& operator-=(const Self& rhs) noexcept { if (v < rhs.v) v += MOD; v -= rhs.v; return *this; } constexpr Self operator*(const Self& rhs) const noexcept { return Self(*this) *= rhs; } constexpr Self& operator*=(const Self& rhs) noexcept { v = (u64)v * rhs.v % MOD; return *this; } constexpr Self operator/(const Self& rhs) const noexcept { return Self(*this) /= rhs; } constexpr Self& operator/=(const Self& rhs) noexcept { return *this *= rhs.inv(); } constexpr bool operator==(const Self& rhs) const noexcept { return v == rhs.v; } constexpr bool operator!=(const Self& rhs) const noexcept { return v != rhs.v; } friend std::ostream& operator<<(std::ostream& stream, const Self& rhs) { return stream << rhs.v; } }; using Modint1000000007 = StaticModint<1000000007>; using Modint998244353 = StaticModint<998244353>; using std::array; using std::pair; using std::tuple; using std::vector; using Fp = Modint998244353; void main_() { int N; std::cin >> N; vector<vector<int>> graph(N); for (const int _ : rep(N - 1)) { int a, b; std::cin >> a >> b; a -= 1, b -= 1; graph[a].push_back(b); graph[b].push_back(a); } const auto ans = rec_lambda([&](auto&& dfs, const int u, const int p) -> array<Fp, 3> { array<Fp, 3> dp = {}; dp[0] = dp[1] = 1; for (const int v : graph[u]) { if (v == p) { continue; } const auto add = dfs(v, u); array<Fp, 3> next = {}; // OR for (const int i : rep(3)) { for (const int j : rep(3)) { if (i == 2 or j >= 1) { next[2] += dp[i] * add[j]; } else { next[i] += dp[i] * add[j]; } } } // AND for (const int i : rep(3)) { for (const int j : rep(3)) { if (i == 2 or j == 2) { next[2] += dp[i] * add[j]; } else { next[i and j] += dp[i] * add[j]; } } } dp = std::move(next); } return dp; })(0, -1); std::cout << ans[1] + ans[2] << '\n'; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); main_(); return 0; }
Submission Info
Submission Time | |
---|---|
Task | F - Logical Operations on Tree |
User | KoD |
Language | C++ (GCC 9.2.1) |
Score | 800 |
Code Size | 5942 Byte |
Status | AC |
Exec Time | 55 ms |
Memory | 22716 KiB |
Compile Error
./Main.cpp: In function ‘void main_()’: ./Main.cpp:138:20: warning: unused variable ‘_’ [-Wunused-variable] 138 | for (const int _ : rep(N - 1)) { | ^
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 800 / 800 | ||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | sample_01.txt, sample_02.txt |
All | random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt, random_30.txt, random_31.txt, random_32.txt, random_33.txt, random_34.txt, random_35.txt, random_36.txt, random_37.txt, random_38.txt, random_39.txt, random_40.txt, sample_01.txt, sample_02.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
random_01.txt | AC | 6 ms | 3580 KiB |
random_02.txt | AC | 46 ms | 8644 KiB |
random_03.txt | AC | 42 ms | 8176 KiB |
random_04.txt | AC | 9 ms | 3776 KiB |
random_05.txt | AC | 26 ms | 6348 KiB |
random_06.txt | AC | 7 ms | 3868 KiB |
random_07.txt | AC | 15 ms | 4368 KiB |
random_08.txt | AC | 28 ms | 5476 KiB |
random_09.txt | AC | 44 ms | 8048 KiB |
random_10.txt | AC | 21 ms | 5508 KiB |
random_11.txt | AC | 2 ms | 3564 KiB |
random_12.txt | AC | 46 ms | 8708 KiB |
random_13.txt | AC | 40 ms | 8124 KiB |
random_14.txt | AC | 37 ms | 7272 KiB |
random_15.txt | AC | 28 ms | 6192 KiB |
random_16.txt | AC | 44 ms | 15508 KiB |
random_17.txt | AC | 50 ms | 20860 KiB |
random_18.txt | AC | 23 ms | 12144 KiB |
random_19.txt | AC | 55 ms | 22716 KiB |
random_20.txt | AC | 10 ms | 4620 KiB |
random_21.txt | AC | 20 ms | 5668 KiB |
random_22.txt | AC | 6 ms | 4200 KiB |
random_23.txt | AC | 15 ms | 5952 KiB |
random_24.txt | AC | 25 ms | 8000 KiB |
random_25.txt | AC | 14 ms | 5688 KiB |
random_26.txt | AC | 18 ms | 5432 KiB |
random_27.txt | AC | 11 ms | 4720 KiB |
random_28.txt | AC | 34 ms | 7500 KiB |
random_29.txt | AC | 36 ms | 8352 KiB |
random_30.txt | AC | 30 ms | 7632 KiB |
random_31.txt | AC | 29 ms | 6300 KiB |
random_32.txt | AC | 23 ms | 5736 KiB |
random_33.txt | AC | 16 ms | 4780 KiB |
random_34.txt | AC | 11 ms | 3932 KiB |
random_35.txt | AC | 18 ms | 4784 KiB |
random_36.txt | AC | 38 ms | 7304 KiB |
random_37.txt | AC | 32 ms | 6632 KiB |
random_38.txt | AC | 21 ms | 5836 KiB |
random_39.txt | AC | 30 ms | 6416 KiB |
random_40.txt | AC | 37 ms | 7536 KiB |
sample_01.txt | AC | 2 ms | 3616 KiB |
sample_02.txt | AC | 2 ms | 3572 KiB |