情報妖精の競プロ日記

AtCoderの問題に対する方針を主に書きます

AtCoder Regular Contest 102

AtCoder Regular Contest 102に参加しました!
AtCoder Beginner Contest 108 beta版
AtCoder Regular Contest 102 旧版
AtCoder Regular Contest 108 beta版

解けた問題だけ解説をしていきますー

要項

AtCoder Beginner Contest 108 / Regular Contest 102
rated 1200 / 2800
9/4(土) 21:00 ~ 22:40 (100分)
100-200-300-700-700-1200 (6問)
ペナルティ: 5分

方針

ただいま合宿中なので、あまり時間は掛けられない。
従って、CD2完を速くして残った時間でE挑みを軽くしてみる程度に抑えたいところ。

A - Pair

1からKの中に偶数は\lfloor \frac{K}{2} \rfloor個、奇数は\lfloor \frac{K+1}{2} \rfloor個あるので、ペアの数は\lfloor \frac{K}{2} \rfloor \lfloor \frac{K+1}{2} \rfloor個となります。

B - Ruined Square

まず、正方形であるからx2 - x1 = y3 - y2, x2 - x3 = y2 - y1となります。
また、対角の座標の和は等しいはずなので、x1+x3=x2+x4, y1+y3=y2+y4となります。
ここから、y4-y1=y3-y2よりy4=y1+(y3-y2)=y1+x2-x1と分かります。
あとはy3=y2+y4-y1=y2+x2-x1x3=x2+y1-y2x4=x1+y1-y2と導出できるので、それを出力すれば良いです。

C - Triangular Relationship

考え方は2つありますが、まずは決め打ちで解いていくことを考えてみましょう。
ここではaを決め打ちます。ただし 0 \leq a < Kとします。
この時、 a+b \equiv 0 \pmod{K}より b \equiv nK - a \pmod{K}(nは任意の正の整数)と分かります。
同様にcも分かり、 b + c \equiv 0 \pmod{K}よりb + c \equiv nK + mK - 2a \equiv 0 \pmod{K}であるから2a \equiv 0 \pmod{K}ということが分かります。
従って、2aKの倍数であるときはbcはそれぞれx = 2a \bmod Kを用いて {\lfloor \frac{N + x}{K} \rfloor}^2通りとなります。
後は足していけば解けます。

なお、上の式を更に工夫すると、Kが奇数ならばaKの倍数でありx=0となるから、答えは {\lfloor \frac{N}{K} \rfloor}^3です。
逆にKが偶数ならばa\frac{K}{2}の倍数だから、答えは{\lfloor \frac{N}{K} \rfloor}^3 + {\lfloor \frac{N + \frac{K}{2}}{K} \rfloor}^3です。

D - All Your Paths are Different Lengths

構築問題は、簡単な規則性があるはずです。
まずは、問題に着目するとN \leq 20, M \leq 60という非常に小さい値に気付きます。
また、L \leq 10^6 = 1000000 \fallingdotseq 1048576 = 2^{20}より、おそらく何らかの方法で{\rm O}(\log L)が出てくると想像できます。
そこで、まずは丁度L通りの経路ができるような辺を考えていきましょう。

実験をすると、経路数は各頂点について移動前の経路の合計になることが分かるので、多重辺の経路数は積の形になることが分かります。
例えば、1 \rightarrow 2の経路を2つ、2 \rightarrow 3の経路を3つ置くと1 \rightarrow 3の経路は全部で2 \times 3 = 6通りになります。
ということは、例えばn \rightarrow n + 1 (1 \leq n < 20)の経路を2つずつ用意すると、38個の辺で2^{19}=524288通りまで対応できます。
さて、もちろんですがLは2の乗数とは限りません。
その点を調整していきます。
まず、L = 6としてみましょう。
まずは1 \rightarrow 2に2個、2 \rightarrow 3に2個の辺を置きます。これで4通り。
この時、1 \rightarrow 1は1通り、1 \rightarrow 2は2通りあることに着目すると、2 \rightarrow 3にもう1個辺を増やすとちょうど経路が2個増えます。
同様に、例えばL = 7とすると1 \rightarrow 32 \rightarrow 3に1個ずつ辺を増やせば経路が3個増えます。
このような辺の置き方は、Lを2進数で表した時の値を見れば分かります。
例えば、L = 13 = 1101_{(2)}のときは頂点数N = 4であり、1 \rightarrow 43 \rightarrow 4に追加の辺が置かれます。
この時、各頂点に対して高々3個しか辺を伸ばさないことから、M \leq 19 \times 3 = 57より条件を満たします。

さて、これで辺の繋ぐ場所は分かったので、後は長さをどうするか考えましょう。
まず、i番目の頂点に対して長さが0, 1, \cdots, 2^i - 12^i通り網羅したいので、i \rightarrow i + 1の辺の長さは02^{i - 1}の2つにします。
後は、残りの辺の長さは今まで繋いだ経路数+1にすれば良いので、毎回加算しながら辺の経路を決めていけば解けます。

結果

oox- 2完(1000点) 15:07(1WA)-65:11 / 70:11
169位 パフォーマンス: 2074
レート: 16951739(+44)

感想

宴会中な割に早解きできた点は良い点だけど、E問題も頑張れば解けたはずなのでこれは反省。
もう少し構築問題は速く解きたいところ。
構築問題は簡単な規則性があるので、如何に速く気付くかが鍵か。