Bananas Multiplier (Easy/Hard)

Quiz

(hardも通る)解法

  • (0-indexedとする)
  • 頂点0からの最短距離(辺の本数)を各頂点について求める
  • 各頂点にたどり着いた時のcの積をそれぞれ求める。これは直前の点の値が分かればO(1)で求まるので、全体ではO(N)で求まる
    • メモ化再帰なり、dpなりで
  • 例えば下記画像で、頂点2~頂点5までの積を求めたいなら、「頂点0~5までの積」÷「頂点0~2までの積」で求まる
    • modの世界なので割り算は逆元で処理する

f:id:peroon:20200229194000p:plain

  • 画像のように、頂点aから頂点bに行くときに、頂点0を挟むかどうかの場合がある
  • LCAをlog(N)で求められるように前準備しておけば、除去する辺は求まる
  • 実は、どちらの場合であっても統一的に処理できる。下記コード参照
// 関数fは、頂点0からその頂点に行くまでのcの積とする

// クエリ処理
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のコスト

要素

  • 最短距離
  • メモ化再帰 or DP
  • 逆元
  • LCA