physics0523's 精進ログ

主に競プロの面白い問題の解法をメモします

Rainbow Branch (CFR1064-D1E)

https://codeforces.com/contest/2165/problem/E

$N$ 頂点の木が与えられる。

$k=1,2,\dots,N-1$ について、以下の問題に答えよ。

  • 木の各辺を色 $1,2,\dots,k$ で塗り分けることを考える。ただし、全ての色を少なくとも $1$ 度は使わなければならない。
  • $f(u,v) = $ $u$ から $v$ へのパス上に塗られた色の種類数と定義する。
  • 塗り分けの 不便さ を $\displaystyle \max_{1 \le u,v \le N} f(u,v)$ と定義する。
  • 達成可能な不便さの 最小値 を求めよ。

$3 \le N \le 3 \times 10^5$

公式解説ベースで、自分が分からないところを補間しながらまとめます。

 

取り扱いやすいように、本問題の key と value を入れ替える。即ち、不便さが $l$ 以内となるような塗り分けで最大何色使えるかを考える。

 

まず、次の主張を確認します。

最適な塗り分けにおいて、各色の辺だけ見た時、色ごとに $1$ つの連結成分を成す。

色 $c$ に非連結な複数の成分があったとします。このとき、最も「外側」(厳密には、色 $c$ で補助木を考えた時の葉にあたる成分) の連結成分 $X$ に対して次が成り立ちます。

  • 連結成分 $X$ から他の色 $c$ の連結成分 $Y$ に向かう時に最初に通る辺の色を $d$ とする。このとき、 $X$ 全体を色 $d$ で塗っても不便さは大きくならない。

以下の図だと、丸を付けた色 $1$ の連結成分全体を色 $4$ で塗ることに相当します。

丸を付けられた方の色 $1$ の連結成分が $X$ 、そうでない色 $1$ の連結成分が $Y$ です。

  • 元から $X$ も $Y$ も通らないパス
    • 何も起こらない。
  • 元から $Y$ のみを通るパス
    • 何も起こらない。
  • 元から $X$ のみを通るパス
    • $Y$ を根と考える。
    • $X$ の子から $X$ に入り、 $X$ の子に向かって出ていく場合
      • この場合、パス中で $X$ が唯一の色 $1$ の連結成分である。
      • この場合、色 $1$ の役割が色 $4$ に変わるだけなので、この塗り替えで不便さは大きくならない。
    • $X$ の親から $X$ に入り、 $X$ の子に向かって出ていく場合
      • この場合、 $X$ に入る時に色 $4$ の辺を通ることになるので、この塗り替えで不便さは大きくならない。
  • 元から $X$ も $Y$ も通るパス
    • $X,Y$ 間の移動において色 $4$ の辺を通ることになるので、この塗り替えで不便さは大きくならない。

この塗り替えを繰り返していくことで、各色が $1$ つの連結成分を成すまで変形していけるので、題意が示されました。

 

ところで、この問題では、木の直径のようなものを訊いています。なので、木の中心のような量を考えることが筋良です。参考 類題

不便さの最大値を $d$ と置く。このとき、実際に $d$ を達成するパスに着目することで、以下が発見できます。これ以降、これらを と呼びます。

  • $d$ が奇数であるとき、核は辺である。
    • 核から全ての葉に向かう際に通る色の種類数が $(d-1)/2$ 以下である。
  • $d$ が偶数であるとき、核は頂点である。
    • 核から全ての葉に向かう際に通る色の種類数が $d/2$ 以下である。

引用: 公式解説の図

 

この核を使って、次の事項を証明します。

  • 核からの色数の条件を満たす塗り分けを考える。
  • ある葉から核に向かうパスについて、色が $a-b-c-c-d-e-\dots$ のようになっている(葉から辿って行って、色の境界が葉から始めて連続で発生していない)部分がある。この時、このパスの色を $a-b-c-d-d-e-\dots$ のように変更して使える色数が減ることはない。
  • より端的には、色の境界を核から葉の方向に押しても損しない。

この図を見てもらうとわかりやすいが、部分木中の数字はその部分木で残り使える色の種類数を表す。確かに、境界を葉に向かって押した場合が押さなかった場合の上位互換となっていることが分かる。

あとは、部分木中で新たに適切に新色を導入すれば得できる。

これを、このような操作ができる限り繰り返せば良いことになる。

 

ここまでの議論をまとめると、

  • 核は存在せざるを得ない。
  • 核があるとき、色の境界を核から葉に向かって押せるだけ押すのが最適である。

ここから、許されている不便さの最大値 $d$ の偶奇別に、以下の最適な構築ができる。

  • $d$ が奇数であるとき
    • 核は辺である。
    • 核が存在せざるを得ないので、核から葉に向かって最大 $(d-1)/2$ 色しか使うことが出来ない。
    • このもとで、可能な限り葉に向かって色の境界を押すことを考える。
    • すると、以下の手順で塗り分けることが最適となる。
      • 以下を $(d-1)/2$ 回繰り返す。
        • 現在の木の葉に繋がる辺を異なる色で塗り分ける。その後、それらの葉と辺を取り除く。
      • 残り使えるのはパス当たり $1$ 色なので、残った辺が全て核である。
  • $d$ が偶数であるとき
    • 核は頂点である。
    • 核が存在せざるを得ないので、核から葉に向かって最大 $d/2$ 色しか使うことが出来ない。
    • このもとで、可能な限り葉に向かって色の境界を押すことを考える。
    • すると、以下の手順で塗り分けることが最適となる。
      • 以下を $(d/2)-1$ 回繰り返す。
        • 現在の木の葉に繋がる辺を異なる色で塗り分ける。その後、それらの葉と辺を取り除く。
      • 残り使えるのはパス当たり $2$ 色である。
      • なので、残った頂点のうち現時点での次数が最大のものを核とし、その頂点周りの辺およびそこから伸びる連結成分を全て異なる色で塗れば最適である。

引用: 公式解説の図 再掲

 

https://codeforces.com/contest/2165/submission/349759306

 

公式解説だけでは解法の正当性が腑に落ちなかったのでメモ。

自力でも葉のレイヤを求めるみたいなことには辿り着けてサンプルは通ってたんだけど、通し切るまでもう一段かかるなぁという印象。

2 h 6 問の 5 問目だから落として許されてるところあるけど、 3 h だったら通したい問題ですね...

FPS 24 題に「ちゃんと」取り組む #4 (fps24-D)

A B C D E
F G H I J
K L M N O
P Q R S T
U V W X  

 

D - Sequence 2

$M $ 以下の非負整数からなる長さ $N$ の整数列 $A$ であって以下の条件を満たすものを数えよ。 ${\rm mod}$ $998244353$

  • $A$ を昇順ソートした列 $B$ について、隣接する要素の偶奇が異なる。

$1 \le N,M \le 2 \times 10^5$

 

本番解法:

$B$ の要素は明らかに相異なるので、並べ方の自由度が $N!$ ある。このもとで $B$ を数えることにする。

$B_N-B_1$ を $N-1,N+1,N+3,\dots$ と固定。このもとで公差を「 $2$ ずつ配る」ことを考える。これは二項係数で求まる。

最後に $B_1$ の自由度ぶん係数を掛ければ ok。

https://atcoder.jp/contests/fps-24/submissions/70656350

 

FPS 解は以下の通り。

$B$ を数えて $N!$ 倍するところは同じ。

求めたいものは次のように書ける。

$[x^M] (1+x+x^2+\dots) \times (x+x^3+x^5+\dots)^{N-1} \times (1+x+x^2+\dots)$

$=[x^M] (1+x+x^2+\dots)^2x^{N-1}(1+x^2+x^4+\dots)^{N-1}$

$=[x^{M-N+1}] (1+x+x^2+\dots)^2(1+x^2+x^4+\dots)^{N-1}$ ... ★

$\displaystyle =[x^{M-N+1}] \frac{1}{(1-x)^2} \times \left ( \frac{1}{(1-x^2)} \right ) ^{N-1}$

ここで手が止まってしまって解説を見に行く。分母の因数分解をすれば良いらしいがまだ慣れないなぁ...

$\displaystyle [x^{M-N+1}] \frac{1}{(1-x)^2} \times \left ( \frac{1}{(1-x)(1+x)} \right )^{N-1}$

$\displaystyle =[x^{M-N+1}]  \left ( \frac{1}{(1-x)} \right )^{N+1} \times \left ( \frac{1}{(1+x)} \right )^{N-1}$

 

ここまで来ると左側の $x^k$ の係数と右側の $x^{M-N+1-k}$ の係数 を組み合わせれば良い。

もっとも、★ の時点で $(1+x+x^2+\dots)^2$ の係数列が明らか (やることもほぼ同じ) なので、考察終了としてしまってもいいかもしれない。

$N=1$ がコーナーケース。

https://atcoder.jp/contests/fps-24/submissions/70854624

 

これはなんか組み合わせ論的解釈の方が単純に感じたなぁ

FPS 24 題に「ちゃんと」取り組む #3 (fps24-C)

A B C D E
F G H I J
K L M N O
P Q R S T
U V W X  

 

C - Sequence

$M $ 以下の非負整数からなる長さ $N$ の整数列のうち、総和が $S$ であるものの個数 ${\rm mod}$ $998244353$ を求めよ

 

$1 \le N,M,S \le 2 \times 10^5$

 

本番解法: さすがに有名問題。 $M $ を超える要素の個数 $k$ を固定して、包除原理。

https://atcoder.jp/contests/fps-24/submissions/70655443

 

FPS 解法はこんな感じ。

$[x^S] (1+x+\dots+x^M)^N$

$\displaystyle =[x^S] \frac{(1-x^{M+1})^N}{(1-x)^N}$

これを分母と分子に切り分けて扱うことで求める。

分子の $x^k$ につく係数は $k$ が $M+1$ の倍数でないとき $0$ 、 $k$ が $M+1$ の倍数であるとき $l=k/(M+1)$ として $(-1)^l \times C(N,l)$ 。

(分母の影響を受けた結果) $x^S$ につく係数への寄与を求めたいが、これは $(1+x+x^2+\dots)^N$ の $x^{S-k}$ につく係数を考えればよく、 $C(S-k+N-1,S-k)$ 倍として表現される。

組み合わせ論的には $S-k$ 個の区別できない球を $N$ 箱に分ければ ok 。

https://atcoder.jp/contests/fps-24/submissions/70852859

包除通らず導出できるのはすごい楽かもしれない。

初めて公式解説見ずに FPS 解法導出できた。洗脳始まってきてるなぁ

FPS 24 題に「ちゃんと」取り組む #2 (fps24-B)

A B C D E
F G H I J
K L M N O
P Q R S T
U V W X  

 

B - Tuple of Integers

 

以下の条件を全て満たす非負整数の組 $(a,b,c,d)$ を数え上げよ。 ${\rm mod}$ $998244353$

  • $a+b+c+d=N$
  • $a \in \{0,1\}$
  • $b \in \{0,1,2\}$
  • $c$ は偶数
  • $d$ は $3$ の倍数

 

$0 \le N \le 10^9$

 

本番解法: $f(x)$ を以下の条件を満たす非負整数の組 $(c,d)$ の個数とする。

  • $c+d=x$
  • $c$ は偶数
  • $d$ は $3$ の倍数

実験エスパーすると次のコードで求まるらしい。

あとは $a,b$ を全通り探索すれば ok 

https://atcoder.jp/contests/fps-24/submissions/70656739

 

これもまぁオーバーキル気味らしい。実験エスパーも入ってますからね…

 

欲しいものは次の通り。

$[x^N] (x+1)(x^2+x+1)(1+x^2+x^4+\dots)(1+x^3+x^6+\dots)$

無限和が入っているのでなんとかしようとする。無限等比数列の公式をそのまま使ってよい。

$(1+x^2+x^4+\dots) = \frac{1}{(1-x^2)}=\frac{1}{(1-x)(1+x)}$

$(1+x^3+x^6+\dots) = \frac{1}{(1-x^3)}=\frac{1}{(1-x)(1+x+x^2)}$

因数分解して筋良になるかもというのは A問題 でも扱いましたね。

 

積を計算すると

$[x^N] \frac{(x+1)(x^2+x+1)}{(1-x)(1+x)(1-x)(1+x+x^2)}$

$=[x^N] \frac{1}{(1-x)^2}$

 

公式解説 ではここから公式を利用していますが、この記事ではもうちょっと詰めてみましょう。

$[x^N] \frac{1}{(1-x)} \times \frac{1}{(1-x)}$

無限和の形に戻して

$[x^N] (1+x+x^2+\dots) \times (1+x+x^2+\dots)$

$x^N$ の項の係数は左から $x^k$ 、右から $x^{N-k}$ を選んだ $(0 \le k \le N)$ パターンの和と一致するので、欲しい値が $N+1$ であることが分かる。 

まぁここから公式解説での公式も直ちに得られますね。

 

https://atcoder.jp/contests/fps-24/submissions/70717927

 

B まさかのギャグで仰天。でも FPS 知らないとギャグがギャグであるとも見抜けない可能性があるんだなぁ...

 

本番解法の $f$ のくだりも FPS で楽に出たりするのかなぁ

自分が証明しろと言われると、 $2x+3y=N$ の非負整数解の個数みたいな話になるので $x$ の範囲を求めて $(+3,-2)$ でずらせてどうたらみたいな感じで証明しそう。

 

 

$\frac{1}{(1-x^2)} = \frac{(1+x^2+x^4)}{(1-x^6)}$

$\frac{1}{(1-x^3)} = \frac{(1+x^3)}{(1-x^6)}$

と分母を揃えて分子は分子同士の積で得る、なるほど。慣れればむっちゃ楽そう。

FPS 24 題に「ちゃんと」取り組む #1 (fps24-A)

先日 AtCoder 上で開催された話題の有志コン、 FPS 24 題

FPS(形式的冪級数) に関する問題を 24 問集めた知の高速道路です。

 

私も本番参加させて頂き、13完41点という感じでした。

しかしながら、本番では DP、実験エスパー、OEIS、オーバーキルなど種々のズルをしている問題もたくさんあるので、それらと想定解に乖離がある場合や本番で手が届かなかった問題も含めて FPS 24 題で伝えたいことを「ちゃんと」勉強するという本連載を立ち上げました。

1 問 1 記事にする予定のため本連載は 24 回になりそうなもんですが、多分途中何度も逃亡すると思います(ごめんなさい)。また、軽い問題は何問かまとめる可能性もあります。

私は FPS に対して大変疎い(正直、FPS自体かなり競プロじゃないと思ってます)ため、そのような読者にとっては親しみやすい記事になると思います。逆に、 時に厳密さを捨てたり感覚的な理解を伝えたりするので、 FPS に関して深い理解のある方にとっては稚拙な記事になるかもしれません。その場合は優しくご教授頂いたり、誤りを指摘して頂いたり、お帰り頂くなりして頂けると幸いです。

では、始めましょう。

 

A - Snack

各要素が $1,3,4,6$ である長さ $D$ の数列であって、全要素の和が $N$ であるものはいくつあるか? ${\rm mod}$ $998244353$

 

$1 \le D \le 2 \times 10^5$

$1 \le N \le 10^6$

 

本番解法: $(x^1+x^3+x^4+x^6)^D$ を繰り返し二乗法+畳み込みで愚直に計算。時間計算量 $O(N \log^2 N)$ 。

https://atcoder.jp/contests/fps-24/submissions/70656561

 

なんでこれが $2$ 点の A 問題なんだと一生首を捻っていたが、どうやらオーバーキルらしい。

 

想定解ベースで再考察すると次の通り。

$(x^1+x^3+x^4+x^6)$ にいい性質がないか探りにかかる。

すると、先ほどの式が因数分解でき、 $x(x^2+1)(x^3+1)$ となる。

欲しいものは $[x^N] (x(x^2+1)(x^3+1))^D$ である。( $[x^k] (x$ の式$)$ で $x$ の $k$ 乗に付く係数を指す)

$[x^N] (x(x^2+1)(x^3+1))^D$

$=[x^{N-D}] (x^2+1)^D(x^3+1)^D$

ここで、何が嬉しいかというと、元々「 $4$ つの和を $D$ 乗する」という扱いにくいものから「 $2$ つの和を $D$ 乗したもの $2$ つの積」というまぁまぁ希望的な形になったことである。

あとは、二項定理を使って $x^2$ が何回かかるかを固定し足し上げればよい。

組み合わせ的解釈を入れると、以下のような感じになる。

以下の行動の部分集合を $D$ ラウンド繰り返す。

  • $2$ 円稼ぐ。
  • $3$ 円稼ぐ。

$N-D$ 円稼ぐような $D$ ラウンドの過ごし方は何通りか?

こう言われると、 $2$ 円稼ぐのと $3$ 円稼ぐのが独立に扱えているのが嬉しいし、 $2$ 円稼ぐ回数を固定すれば筋良そうに思えるし、現実にそう。この解釈に至るまでに先ほどの式変形を経由している。

 

https://atcoder.jp/contests/fps-24/submissions/70716720

 

因数分解を経由して解けるみたいな問題はちょいちょい聞くので、 A からいきなり高度で仰天。先が思いやられる。

Loyalty (CF Pinely Round 5-C)

Problem - C - Codeforces

整数 $N,X$ と各要素が $1$ 以上 $X$ 以下の整数である長さ $N$ の数列 $A$ が与えられる。

$A$ の要素を並べ替えることで、以下で定義される「ポイント」を最適化せよ。

  • 最初、 $h=0$ とする。
  • その後、 $i=1,2,\dots,N$ について以下を繰り返す。
    • $h$ に $A_i$ を加算する。
    • この時点で $h$ が $X$ 以上である場合、 $h$ から $X$ を減算し、 $A_i$ ポイント獲得する。

$1 \le N \le 10^5$

$1 \le X \le 10^9$

$1 \le A_i \le X$

 

$A$ を並べ替えようと総和は一定、かつ全ての要素が $1 \le A_i \le X$ なので、ポイントが加算される回数を変えることはできない。

なので、 $A$ のうち大きい方から $k$ 要素を選んでそれをポイントの加算対象にしたい(それが自明な上界となる)が、どうすれば良いだろうか?

 

ポイント加算対象を直接置く方法は部分和問題みたいなものが出てきて上手くいかなそう。

いったん心を落ち着けて $A$ を昇順ソートして、前から最終的な数列を決定することを考えてみる。

すると、以下のどちらかが常に可能であることが示せる。

  • ポイントを加算しないように、最小の要素 $m $ を最終的な数列の末尾に付ける
  • ポイントを加算するように、最大の要素 $M $ を最終的な数列の末尾に付ける

証明

背理法で示す。

前者も後者も不可能であるとき、 $m $ を末尾に付けるとポイントが加算され、 $M $ を末尾に付けるとポイントが加算されないことになる。しかし、 $m \le M $ であるはずなのでこれは矛盾。

これから、以下の手法でポイントを自明な上界とできる。

 

  • まず、 $A$ を昇順ソートして全て deque に突っ込む。
  • 次に、dequeの末尾を現在の列の末尾に追加した際ポイントが増えるなら、そうする。その後、 deque の末尾を消す。
  •  そうでないなら、dequeの先頭を現在の列の末尾に追加する。その後、dequeの先頭を消す。

https://codeforces.com/contest/2161/submission/346679609

見た目えげつないのに可能枠で証明も面白い。珍しく前半枠で記事書いてる。

Affinity for Artifacts (ARC207-A)

https://atcoder.jp/contests/arc207/tasks/arc207_a

長さ $N$ の数列 $A_i$ (0-indexed) と整数 $X$ が与えられる。

以下の条件を満たす $(0,1,\dots,N-1)$ の順列 $p$ を数え上げよ。 ${\rm mod}$ $998244353$

  • $\displaystyle \sum_{i=0}^{N-1} \max(0,A_{p_i}-i)$ が $X$ 以下である。

$1 \le N \le 100$

$0 \le A_i,X \le 10^9$

解説 AC ではあるんだけど解説を見てもあんまりよくわからず、 GPT 君に手伝ってもらってもよくわからず、結局だいぶ自力で細かいところを詰めた。

 

まず、 $A_i \ge N$ なる要素があったら $X$ を $A_i-(N-1)$ だけ減算して $A_i = N-1$ としてよい。

この際 $X<0$ なら答えは $0$ だし、 $X>N^2$ なら $X=N^2$ としてしまってよい。これを忘れると RE なり TLE なりするので注意。解法理解した後にこれで 2 ペナ出しました。

 

例えば位置 $6$ に $2$ を置くと、本来 $6$ の割引が利いて $-4$ であるものが $0$ になってしまう。このときの $4$ のようなものを loss と呼ぶ。

この loss に対して捉え方を変える。

先頭から要素を置いていく際に、位置 $k$ まで決めた時点で使っていない $k$ 以下の要素が $l$ 個あれば、位置 $k+1$ に移行する瞬間に loss が $l$ だけ増加する。

「 $k$ 以下」という属性があるため、「位置 $k$ を決めた直後に丁度 $k$ である要素たちに色を塗る。それまでは、 $k$ 以上である要素たちは一旦区別しないでおく。」という手続きを考える。今後は位置 $k$ を決めた以降の時点において、まだ使われず残っている $k$ を remain 0 と呼ぶことにする。

また、「場合の数」ではなく「確率」で考えて最後に「場合の数」に戻した方が楽なので、そうする。

 

以下の DP を行う。

$dp[$ loss の総和 $][$ remain 0 の個数 $]=\{$ そうなる確率 $\}$

  • $dp[0][0]=1$ から始める。
  • $pt=0,1,\dots,N-1$ について以下を繰り返す。
    • まず、位置 $pt$ に置く要素を決める。
      • $dp[i][j]$ について、 $\frac{j}{N-pt}$ の確率で remain 0 が $1$ 個減る。
    • 次に、 $pt$ と等しい要素に色を付ける。つまり、既に使われている $pt$ には何も起こさず、まだ使われていない $pt$ は remain 0 となる。
      • 以下を $pt$ の個数分繰り返す。
        • まだ色付けしていない要素の総数を $tot$ とする。
        • 一方、色付けしていない要素であってまだ置かれていないものの個数は $dp[i][j]$ に対して $rem=(N-pt-1)-j$ で求められる。
        • $\frac{rem}{tot}$ の確率で、 remain 0 が $1$ 個増える。
        • この結果、色付けしていない要素が $1$ 個減る。
    • 最後に、 $pt$ から $pt+1$ に移行する。
      • この際、 remain 0 と同じだけ loss が増加する。

結局、 $dp[i]$ の総和を $i$ が $0$ から許される loss の最大値まで足し合わせて行けば確率が求まり、 $N!$ を掛けて答えが求まる。

https://atcoder.jp/contests/arc207/submissions/69932667

 

この手の数え上げ一生ハメてて一生死んでる。今回は挿入DPしようとして死んでました。

いい加減解けるようになるべき。