Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで色付きタイルがカバーできるブロック数を求めるプログラム

ある道に n 個のブロックが並んでおり、作業員がそのブロックに色付きタイルを貼っていく場面を考えてみましょう。作業員は「番号が 4 または 2 で割り切れるブロック(ただし 42 を除く)」にだけ色付きタイルを貼るというルールに従います。このとき、最初に k 枚の色付きタイルを持っている場合、何番目までのブロックをカバーできるかを求めるのがこの問題です。

例えば、入力が k = 16 の場合、出力は 32 になります。これは、偶数番号のブロック 2, 4, 6, …, 32 の計 16 個にタイルを貼ると、ちょうど 16 枚を使い切るためです。

解き方のアプローチ

この問題は、42 というスキップ対象のブロックが一定間隔で現れることに着目すると、O(1) で効率的に解けます。具体的には以下の手順で計算します。

  • MOD = 10^9 + 7 を定義します(結果が巨大になった場合の剰余演算用)。
  • quotient := k を 20 で割った商(小数点以下切り捨て)
  • remainder := k を 20 で割った余り
  • remainder が 0 の場合は、(42 × quotient − 2) mod MOD を返します。
  • それ以外の場合は、(42 × quotient + 2 × remainder) mod MOD を返します。

なぜ 20 で割るのかというと、42 番目のブロックに達するまでは偶数番号ごとにタイルを貼れるため、k ≤ 20 の範囲では答えは単純に 2 × k になるからです。しかし 21 枚目以降は 42 番のブロックをスキップしなければならず、その分を補正するためにこの式になっています。

実装例

理解を深めるために、以下の Python 実装を見てみましょう。

def solve(k):
   MOD = 10**9 + 7
   quotient = k // 20
   remainder = k % 20
   if remainder == 0:
      return ((42 * quotient - 2) % MOD)
   else:
      return ((42 * quotient + 2 * remainder) % MOD)

print(solve(16))

入力

16

出力

32
  1. Pythonでエンコードされたメッセージのデコード方法の総数を求めるプログラム

    問題の概要「a」= 1、「b」= 2、…「z」= 26 というアルファベットと数字の対応関係があるとします。このとき、エンコードされたメッセージ(数字列)が与えられれば、そのメッセージをデコードできる方法が何通りあるかを数えるのが本記事のテーマです。例えば、入力が message = 222 の場合、出力は 3 になります。これは次の3通りにデコードできるためです。b・b・b(2, 2, 2)b・v(2, 22)v・b(22, 2)解決のアプローチ:動的計画法(DP)この問題は動的計画法を用いることで効率的に解くことができます。各位置 i までの文字列についてデコード方法の総数を記録し、1文字

  2. Pythonでグリッド上に集められるコインの最大数を求めるプログラム

    問題の概要各セルにコインが置かれた2次元行列(マトリックス)があるとします。左上の [0,0] の位置からスタートし、右または下にのみ移動できるという制約のもとで、右下隅まで移動する過程で収集できるコインの最大数を求めるのがこの問題です。例として、次のような入力が与えられた場合を考えてみましょう。14226005この場合、出力は 14 になります。これは、パス [1, 4, 2, 2, 5] を通ることで、合計14枚のコインを集められるためです。解き方(動的計画法)この問題は動的計画法(DP)を使うと効率的に解けます。考え方はシンプルで、「あるセルに到達した時点でのコインの最大累積数」は、「そ