Quiz
(hardも通る)解法
- (0-indexedとする)
- 頂点0からの最短距離(辺の本数)を各頂点について求める
- 各頂点にたどり着いた時のcの積をそれぞれ求める。これは直前の点の値が分かればO(1)で求まるので、全体ではO(N)で求まる
- 例えば下記画像で、頂点2~頂点5までの積を求めたいなら、「頂点0~5までの積」÷「頂点0~2までの積」で求まる
- 画像のように、頂点aから頂点bに行くときに、頂点0を挟むかどうかの場合がある
- LCAをlog(N)で求められるように前準備しておけば、除去する辺は求まる
- 実は、どちらの場合であっても統一的に処理できる。下記コード参照
ll Q;cin>>Q;
while(Q--){
ll a,b,banana;cin>>a>>b>>banana;
a--;b--;
ll lca = LCA(a,b);
ll ans = banana * f(a) % mod * f(b) % mod;
ans *= mod_pow(f(lca), mod-2); ans %= mod;
ans *= mod_pow(f(lca), mod-2); ans %= mod;
p(ans);
}
計算量
- O(Q log(N) ) : クエリ数xLCAのコスト
要素