Aが解けたよ!
という訳で振り返りです。
A - Three Integers
やってみよう!
A
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
コンテスト中に提出したコードはもうちょっとごちゃっとしてた(提出 #32774805)けど、結局目標達成の条件は以下2つのどちらかだけ。
- 3つの数が同じ
- 最も大きい数が他2つの合計以下
結果:提出 #32826161 - AtCoder Regular Contest 143
自由欄
B - Counting Grids
やってみよう!
B
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
これは解説を読んでもスッキリしませんでした。
曰く、
- 「2 つの条件をともに満たさないようなマスは高々 1 つしか存在しません」←分かる
- 「2 つの条件を満たすマスが存在するような書き込み方の個数を数えます」←?
- マスの位置は$N^2$通り
- そのマスと同じ行・列に書き込まれる数の選び方は$\begin{pmatrix}N^2\\2N - 1\end{pmatrix}$通り
- 数の書き込み方は
- マスと同じ行:$(N-1)!$
- マスと同じ列:$(N-1)!$
- 他:$(N-1)^2!$
なぜ「2 つの条件を満たすマスが存在するような書き込み方の個数」が上のようになるのかが分からない…
上の計算を素直に解釈すると、「任意の一行と任意の一列に特定の数を使う場合の組合せ」ってだけで、設問の条件とは無関係だと思うんだけどなぁ…
何はともあれ、「2 つの条件を満たすマスが存在するような書き込み方の個数」は以下の簡単な計算で求まることになります。
$$ \begin{alignat}{1} & N^2 \times (N^2)! \:/\: (N^2 - 2N + 1)! \:/\: (2N - 1)! \times (N-1)! \times (N-1)! \times (N-1)^2! \\ = & \frac{N^2 \times (N^2)! \times (N-1)!^2 \times (N^2 - 2N + 1)!}{(N^2 - 2N + 1)! \times (2N - 1)!} \\ = & \frac{(N^2)! \times N!^2}{(2N - 1)!} \end{alignat} $$
ここで他のプログラミング言語であれば、オーバーフローしないように計算の途中で余りを取る処理を入れ込まなければなりません。
対してPythonの整数型は任意長でデータを保持するので、そのまま計算することができます。(参考:Pythonの整数型はどのように実装されているのか)
結果:提出 #32827156 - AtCoder Regular Contest 143
PyPy(≒Python 3.6)ではmath.perm
が未実装なのでmath.factorial
を使いました。
自由欄
C - Piles of Pebbles
せっかくなのでC問題も見てみます。
やってみよう!
C
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
「二人の最適な行動」とか、どうやって考えたらいいんだ…って感じですが、どうやら$X + Y$で割った余りがポイントのようです。
詳細は解説を参照するとして、コードは以下のようにとてもシンプルになりました。
結果:提出 #32825651 - AtCoder Regular Contest 143
自由欄
まとめ
A~Cは発想力?