Good Bye 2023

スポンサーリンク

A. 2023

追加方法は x, 1, 1, 1, … でよいです.

B. Two Divisors

単に two largest divisors といって x が含まれない問題文は流石に….

小さい約数に対して x/b,x/a が与えられると思うと簡単です.a,b は素数 p,q または p,p2 です.

C. Training Before the Olympiad

入力は 0, 1 としてよいです.何らかの値を 2k 変えるとその値からできるものすべてが 2k 変化するだけだからです.

sum を減らす行為は偶数と奇数で操作することだけです.後手番には常に偶数があるので,奇数の個数に注目すると,おおよそ奇数の個数の 1/3 倍くらい和が減ることが分かります.

D. Mathematical Problem

1690000
1060900
1006009
9610000
9060100
9006001

とするとひとつ足りないので 1960000 も入れて完成.

E. Happy Life in University

ほぼ基本的な木DPのような形です.種類数をどう扱うかだけ要検討という感じです.

種類ごとに代表元ひとつだけが数えられるようにします.具体的に最も根に近いものだけを数えることにします.

すると,c を木の辺に沿って移動するときの列 (diff(v,c))v の変化がいくつかの subtree add で書けます.変化回数のすべての辺に対する sum は O(N) なので,subtree add, subtree max 等のクエリですべてが書けます.

F. Group Division

関節点が存在しないという(制約には書かれていないが問題文に書かれている)条件より st-numbering がとれて,その前半 n1 頂点と後半 n2 頂点をとってくればよいです.O(n1+n2) 時間で解けます.

乱択した全域木の辺で切るという方法でも AC になったそうです.

G. Optimizations From Chelsu

重心分解して根付き木の根を通るパスに帰着します.根が端点の場合は計算しておきます.

(depth,gcd)=(l1,g1),(l2,g2) を組み合わせることを考えます.l1l2 として,(l1+l2)gcd(g1,g2)>l2g2 となる場合だけ調べればよいです.これより g2g1 だけ調べればよいです.

g1=kg2 として,適切な範囲を試します.(l1+l2)g2>l1g1 だけ試せばよいので k<2l2 も仮定できます.

根が端点の場合の答を S として,

  • 2l2g2>S のときだけ計算.1k2l2 だけ計算.
  • 同じ g2 に対しては最大の l2 だけ計算.

のように枝狩りします.これで O(nlog2n) になると思います.公式解説(O(n1.5logn) を主張している)の計算量解析を参考にしました.

  • 計算対象となる (g2,l2) に対して,根からその頂点までの l2 個の根以外の頂点に +1 する.それらの総和をおさえたい.
  • 深さ L の頂点 (G,L) をひとつとってその点に加算が m 回きたとする.ある g2G/m であるような (g2,l2) から加算されたことになる.この (g2,l2)2l2g2>GL を満たさなくてはいけないので 2l2>mL が分かる.この頂点の subtree size は l2L 以上なので,(m2)L/2 以上である.
  • 同じ深さの頂点の subtree が重複しないことから,深さ L の頂点に対する加算回数を m1,m2,,mcnt として (mi2)L/2n が分かる.(mi2)2n/Lmi2n/L+2×cnt
  • これを L について足して,総和は O(nlogn).重心分解と合わせて O(nlog2n)

H2. Matrix Rank (Hard Version)

これは単にほぼ有名問題です.行列を線形写像だと思うと,Ker, Im を固定したうえで計算すればよいです.この固定で q 二項係数がふたつつきます.これに (r,r) full rank matrix の個数をかければよいです.これは線形独立にベクトルをとっていくと考えると簡単な掛け算になります.

CodeForces
スポンサーリンク
シェアする
maspyをフォローする
maspyのHP
タイトルとURLをコピーしました