Submission #61496610


Source Code Expand

#include <iostream>
#include <utility>
#include <vector>
using namespace std;
using ll=long long;
using ull=unsigned long long;

#include <atcoder/all>
using namespace atcoder;
using mint=modint;

#define rep(i, e) for(int i=0; i<(int)(e); ++i)
#define dir(dx, dy) for(auto [dx, dy]: vector{pair{1, 0}, {0, 1}, {-1, 0}, {0, -1}})

#define all(v) (v).begin(), (v).end()
#define all_r(v) (v).rbegin(), (v).rend()

#define in(i) cin >> i
#define in_d(type, i) type i; cin >> i
#define in_z(i) cin >> i; --i
#define in_d_z(type, i) type i; cin >> i; --i
#define out(i) cout << (i) << endl
#define err(i) cerr << (i) << endl
#define out_e() cout << endl
#define err_e() cerr << endl
#define out_s(i) cout << (i) << " "
#define err_s(i) cerr << (i) << " "

#define out_f(i) cout << fixed << setprecision(15) << (i) << endl
#define err_f(i) cerr << fixed << setprecision(15) << (i) << endl
#define out_fs(i) cout << fixed << setprecision(15) << (i) << " "
#define err_fs(i) cerr << fixed << setprecision(15) << (i) << " "

constexpr int max32=1'000'000'000;
constexpr ll max64=1'000'000'000'000'000'000;

template <typename T>
bool chmin(T & l, const T & r) {
    if(r<l){
        l=r;
        return true;
    }
    return false;
}
template <typename T>
bool chmax(T & l, const T & r) {
    if(r>l){
        l=r;
        return true;
    }
    return false;
}

void dfs_1(int v, vector<vector<int>> & g, vector<bool> & seen, vector<vector<mint>> & dp, vector<vector<vector<mint>>> & reroot){
    int sz=g[v].size();
    dp[v]={1, 1};
    rep(i, sz){
        int u=g[v][i];
        if(seen[u]){
            swap(g[v][i], g[v][0]);
            break;
        }
    }
    rep(i, sz){
        int u=g[v][i];
        if(seen[u]){
            continue;
        }
        seen[u]=true;
        dfs_1(u, g, seen, dp, reroot);
        reroot[v][i]=dp[u];
        dp[v][0]*=dp[u][0];
        dp[v][1]*=dp[u][0]+dp[u][1];
    }
}

void dfs_2(int v, vector<vector<int>> & g, vector<bool> & seen, vector<mint> & ans, vector<vector<vector<mint>>> & reroot){
    int sz=g[v].size();
    vector left(sz+1, vector<mint>(2, 1));
    vector right(sz+1, vector<mint>(2, 1));
    rep(i, sz){
        left[i+1][0]=left[i][0]*reroot[v][i][0];
        left[i+1][1]=left[i][1]*(reroot[v][i][0]+reroot[v][i][1]);
    }
    for(int i=sz-1;i>=0;--i){
        right[i][0]=right[i+1][0]*reroot[v][i][0];
        right[i][1]=right[i+1][1]*(reroot[v][i][0]+reroot[v][i][1]);
    }
    ans[v]=right[0][1];
    rep(i, sz){
        int u=g[v][i];
        if(seen[u]){
            continue;
        }
        seen[u]=true;
        reroot[u][0][0]=left[i][0]*right[i+1][0];
        reroot[u][0][1]=left[i][1]*right[i+1][1];
        dfs_2(u, g, seen, ans, reroot);
    }
}

int main(void) {
    in_d(int, n);
    in_d(int, m);
    mint::set_mod(m);
    vector<int> x(n-1);
    vector<int> y(n-1);
    vector g(n, vector<int>());
    rep(i, n-1){
        in_z(x[i]);
        in_z(y[i]);
        g[x[i]].emplace_back(y[i]);
        g[y[i]].emplace_back(x[i]);
    }
    vector<bool> seen_1(n);
    vector dp(n, vector<mint>(2));
    vector<mint> ans(n);
    vector reroot(n, vector<vector<mint>>());
    rep(i, n){
        reroot[i].resize(g[i].size(), vector<mint>(2));
    }
    seen_1[0]=true;
    dfs_1(0, g, seen_1, dp, reroot);
    vector<bool> seen_2(n);
    seen_2[0]=true;
    dfs_2(0, g, seen_2, ans, reroot);
    rep(i, n){
        out(ans[i].val());
    }
    return 0;
}

Submission Info

Submission Time
Task V - Subtree
User Not_Leonian
Language C++ 23 (gcc 12.2)
Score 100
Code Size 3438 Byte
Status AC
Exec Time 227 ms
Memory 74700 KiB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 36
Set Name Test Cases
All 0_00, 0_01, 0_02, 0_03, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13, 1_14, 1_15, 1_16, 1_17, 1_18, 1_19, 1_20, 1_21, 1_22, 1_23, 1_24, 1_25, 1_26, 1_27, 1_28, 1_29, 1_30, 1_31
Case Name Status Exec Time Memory
0_00 AC 1 ms 3532 KiB
0_01 AC 1 ms 3520 KiB
0_02 AC 1 ms 3480 KiB
0_03 AC 1 ms 3504 KiB
1_00 AC 1 ms 3540 KiB
1_01 AC 1 ms 3500 KiB
1_02 AC 227 ms 68564 KiB
1_03 AC 221 ms 63400 KiB
1_04 AC 185 ms 40700 KiB
1_05 AC 185 ms 40676 KiB
1_06 AC 187 ms 39948 KiB
1_07 AC 189 ms 40492 KiB
1_08 AC 187 ms 34384 KiB
1_09 AC 188 ms 35416 KiB
1_10 AC 181 ms 30696 KiB
1_11 AC 186 ms 30888 KiB
1_12 AC 182 ms 30160 KiB
1_13 AC 183 ms 30072 KiB
1_14 AC 186 ms 29840 KiB
1_15 AC 186 ms 30088 KiB
1_16 AC 188 ms 29244 KiB
1_17 AC 189 ms 29816 KiB
1_18 AC 188 ms 29856 KiB
1_19 AC 190 ms 29608 KiB
1_20 AC 185 ms 29292 KiB
1_21 AC 189 ms 29484 KiB
1_22 AC 189 ms 29508 KiB
1_23 AC 191 ms 29532 KiB
1_24 AC 187 ms 29592 KiB
1_25 AC 192 ms 30164 KiB
1_26 AC 192 ms 33116 KiB
1_27 AC 190 ms 31480 KiB
1_28 AC 202 ms 48052 KiB
1_29 AC 201 ms 40688 KiB
1_30 AC 221 ms 57588 KiB
1_31 AC 227 ms 74700 KiB