ブログ名

競技プログラミングやお歌のお話をする高菜です。

ARC 004 (virtual) 解法

コンテストページ

AtCoder Regular Contest 004 - AtCoder

解法

✔A - 2点間距離の最大値 ( The longest distance )

すべての組み合わせを試せばよいです。C++ でしたら、std::hypot がおすすめです。

✔B - 2点間距離の最大と最小 ( Maximum and Minimum )

長くするならば、全てを真っ直ぐに伸ばせばよいです。

短くするならば、端点をくっつけたいです。 くっつけることが出来るのは、過半長を占める長い棒がないことです。 あった場合はその他大勢で可能な限り相殺をしましょう。

✔C - 平均値太郎の憂鬱 ( The melancholy of Taro Heikinchi )

一つ足し忘れたところで、平均値は 1 程度しか少なくなりませんから、ありえそうな N を全探索です。 おそらく 2 通りくらいなのですが、私はコンピュータの力を信じているので前後 10 通りくらい試しました。(はい!?)N を決めたら M が決まります。途中で割り切れなくなったり、M が 1 から N の範囲からはみ出たりしたらだめです。

✔D - 表現の自由 ( Freedom of expression )

符号の配分は binom( M, i ) の、i に関する 1 個飛ばしの和で、これはもちろん高速に求められるのですが、階乗前計算二項係数ライブラリを持っていたので、それで愚直をしました。(はい!?)

あとは素因数ごとに、その重複度を x として、x を M 個に配る場合の数を考えてかけ合わせればよいです。こちらは、階乗の前計算は間に合わないのですが、素因数の数が少ないですから、一つ一つ掛け算で計算をすればよいです。

結果

41:00 全完、当日の 4 位相当です。

このセットならもう少し速くても良かったかなという気持ちです。現代でこの速さなら少し冷えていたかもしれません。