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 |
|
| 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 |