AtCoder Beginner Contest 178をPythonで解く

投稿日: 

Atcoder Python

B!
Daniel AgreloによるPixabay(https://pixabay.com/)からの画像

こんにちは, Shinoryoです.

今回はAtCoder Beginner Contest 178を, Pythonで解いてみた結果を書き連ねていこうと思います.

A - Not

$0$なら$1$, $1$なら$0$を出力すればいいので, すなわち入力値を$x$とすれば$1 - x$を出力すればよいことになります.

B - Product Max

最大になりうるのは$a \times c$, $a \times d$, $b \times c$, $b \times d$のどれかです. それらの中で最大の値を出力します.

C - Ubiquity

  • 全ての整数列:$10^N$通り
  • $0$が存在しない整数列:$9^N$通り
  • $9$が存在しない整数列:$9^N$通り
  • $0$も$9$も存在しない整数列:$8^N$通り

以上から, 求めるべき値は$10^N - 2 \times 9^N + 8^N$を$10^9 + 7$で割った剰余であることが分かります.

Python3の場合は, とりあえず律儀にそれを求めても問題はないと思います.

整数の値が必要以上に大きくならないように, 累乗の処理の中に$10^9 + 7$で割った剰余を求める処理を組み込むこともできます.

D - Redistribution

動的計画法(dynamic programming)で解くことを考えます. $S=1$に対する求める解答を$A_1$, $S=2$に対する求める解答を$A_2$, ……のように書きます. $A_1 = 0$, $A_2 = 0$, $A_3 = 1$, $A_4 = 1$, $A_5 = 1$です. そして, $S = 6$に対して, 問題文の条件に当てはまる整数列は, 以下のものになります.

  • その整数自身($\{ 6 \}$)
  • $3$に対する整数列群(の右側)に$6$を加えたもの($\{ 3,3 \}$)

少し飛んで, $S = 9$に対して, 問題文の条件に当てはまる整数列は, 以下のものになります.

  • その整数自身($\{ 9 \}$)
  • $6$に対する整数列群(の右側)に$3$を加えたもの($\{ 6,3 \}$, $\{ 3,3,3 \}$)
  • $5$に対する整数列群(の右側)に$4$を加えたもの($\{ 5,4 \}$)
  • $4$に対する整数列群(の右側)に$5$を加えたもの($\{ 4,5 \}$)
  • $3$に対する整数列群(の右側)に$6$を加えたもの($\{ 3,6 \}$)

より一般的に$S \geq 6$に対して言えば, 以下のようになります.

  • その整数自身
  • $S - 3$に対する整数列群(の右側)に$3$を加えたもの
  • $S - 4$に対する整数列群(の右側)に$4$を加えたもの
  • ……
  • $3$に対する整数列群(の右側)に$S - 3$を加えたもの

したがって, $S \geq 6$に対する漸化式として,

\begin{align} A_n = A_{n-3} + A_{n-4} + \cdots + A_3 + 1 \label{eq_atcoder-beginner-contest-178-1} \end{align}

が成り立つことが分かります. ここで, $A_1 = A_2 = 0$であることを利用し, また$A_0 = 1$と定義する(上の箇条書きにおける「その整数自身」の代わり)と, 漸化式\eqref{eq_atcoder-beginner-contest-178-1}は

\begin{align} A_n = A_{n-3} + A_{n-4} + \cdots + A_3 + A_2 + A_1 + A_0 \label{eq_atcoder-beginner-contest-178-2} \end{align}

のようになり, $S \geq 3$にまで拡張することができます.

また, 漸化式\eqref{eq_atcoder-beginner-contest-178-2}の添え字を$1$ずらすことによって,

\begin{align} A_{n-1} = A_{n-4} + A_{n-5} + \cdots + A_3 + A_2 + A_1 + A_0 \label{eq_atcoder-beginner-contest-178-3} \end{align}

となります. \eqref{eq_atcoder-beginner-contest-178-2}, \eqref{eq_atcoder-beginner-contest-178-3}より, 新たな漸化式

\begin{align} A_n = A_{n-1} + A_{n-3} \label{eq_atcoder-beginner-contest-178-4} \end{align}

を得ることができます.

どちらの漸化式を用いても解くことができます.

まずは, 漸化式\eqref{eq_atcoder-beginner-contest-178-2}を用いた例.

そして, 漸化式\eqref{eq_atcoder-beginner-contest-178-4}を用いた例.

E以降

E以降は私の能力不足故に省略いたします.

参考にしたサイト等

Search

About Me

自分の写真
理系大学生でした. Bloggerを利用して発信を行っています.

Labels

Blog Archives