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
AC × 2
AC × 42
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