题目:Tree
分析:
这个题第一步很好想,求出每个子树的答案。难的是如何求u上方的贡献。 (引用)
代码:
#include <bits/stdc++.h>
using namespace std
;
typedef long long ll
;
#define print(i) cout << "debug: " << i << endl
#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define mem(a, b) memset(a, b, sizeof(a))
#define pb(a) push_back(a)
#define x first
#define y second
typedef pair
<int, int> par
;
const ll mod
= 1e9 + 7;
const int maxn
= 1e6 + 10;
const int inf
= 0x3f3f3f3f;
int n
;
vector
<int> g
[maxn
];
ll dp
[maxn
];
ll up
[maxn
], res
[maxn
];
int f
[maxn
];
ll
qpow(ll a
, ll n
)
{
ll res
= 1;
while(n
)
{
if(n
& 1) res
= res
* a
% mod
;
a
= a
* a
% mod
, n
>>= 1;
}
return res
;
}
void dfs1(int u
, int fa
)
{
dp
[u
] = 1;
f
[u
] = fa
;
for(int v
: g
[u
])
{
if(v
== fa
) continue;
dfs1(v
, u
);
dp
[u
] = dp
[u
] * (dp
[v
] + 1) % mod
;
}
}
void dfs2(int u
, int fa
)
{
if(u
!= 1)
{
if((dp
[u
] + 1) % mod
== 0)
{
up
[u
] = up
[fa
] + 1;
for(int v
: g
[fa
])
if(v
!= u
&& v
!= f
[fa
])
up
[u
] = up
[u
] * (dp
[v
] + 1) % mod
;
}
else up
[u
] = res
[fa
] * qpow(dp
[u
] + 1, mod
- 2) % mod
;
res
[u
] = (up
[u
] + 1) * dp
[u
] % mod
;
}
else res
[u
] = dp
[u
];
for(int v
: g
[u
])
if(v
!= fa
)
dfs2(v
, u
);
}
int main()
{
cin
>> n
;
for(int i
= 1; i
< n
; i
++)
{
int a
, b
; cin
>> a
>> b
;
g
[a
].pb(b
), g
[b
].pb(a
);
}
dfs1(1, -1);
dfs2(1, -1);
for(int i
= 1; i
<= n
; i
++)
printf("%lld\n", res
[i
]);
}
转载请注明原文地址: https://lol.8miu.com/read-10221.html