Pythonで数日後の製品価格を計算するプログラム(剰余演算対応)
ある人が価格 x の製品を購入したいと考えているとしましょう。しかし、この製品は日が経つごとに価格が前日の x 倍に上昇していきます。そこで、購入を決意してから y 日後に製品の価格がいくらになっているかを求める必要があります。
価格が非常に大きな値になる場合は、答えを 109 + 7 で割った余り(モジュロ)として出力します。入力はペア(タプル)のリストとして与えられ、各ペアの最初の値が初期価格 x、2番目の値が経過日数 y です。
たとえば、入力が以下の場合を考えてみます。
nums = [(5, 2), (6, 8), (2, 12), (2722764242812953792238894584, 3486705296791319646759756475), (1505449742164712795427942455727527, 61649494321438487460747056421546274264)]
このときの出力は 25, 1679616, 4096, 754504594, 32955023 となります。それぞれ 52 = 25、68 = 1679616、212 = 4096 に対応し、巨大な数については 109 + 7 で割った余りの値が返されています。
解法のアプローチ
この問題はシンプルなべき乗計算と剰余演算で解くことができます。手順は以下の通りです。
- i を 0 から nums の要素数まで繰り返す
- x, y にそれぞれ nums[i] の1番目と2番目の値を代入する
- x の y 乗を 109 + 7 で割った余りを出力する
実装例
Python の組み込み関数 pow() は、3つの引数を渡すことで「べき乗の結果を指定した数で割った余り」を高速に計算できます。これはモジュラー指数演算(繰り返し二乗法)として内部で処理されるため、桁数が非常に大きい場合でも効率的に動作します。
def solve(nums):
for i in range(len(nums)):
x, y = nums[i][0], nums[i][1]
print(pow(x, y, 1000000007))
solve([(5, 2), (6, 8), (2, 12),
(2722764242812953792238894584, 3486705296791319646759756475),
(1505449742164712795427942455727527, 61649494321438487460747056421546274264)])入力
[(5, 2), (6, 8), (2, 12), (2722764242812953792238894584, 3486705296791319646759756475), (1505449742164712795427942455727527, 61649494321438487460747056421546274264)]
出力
25 1679616 4096 754504594 32955023
まとめ
毎日 x 倍に増加する価格を y 日分計算する問題は、結局のところ xy mod (109 + 7) を求めることに帰着します。Python では pow(x, y, 1000000007) と書くだけで、巨大な指数を持つべき乗の剰余を瞬時に算出できるため、競技プログラミングなどでも頻繁に活用されるテクニックです。
-
Pythonで倉庫(godown)に押し込めるボックスの数を求めるプログラム
問題の概要 2つの整数配列が与えられていると仮定しましょう。一方のリストには単位幅のボックスの高さが、もう一方の配列には倉庫(godown)内の各部屋の高さが格納されています。部屋には 0〜n の番号が付いており、各部屋の高さは godown 配列の対応するインデックスに記録されています。ここで、倉庫に押し込むことのできるボックスの数を求めます。 ただし、以下のルールを守る必要があります。 ボックスを積み重ねることはできません。 ボックスの順序は自由に入れ替えられます。 ボックスは必ず左から右へ向かって挿入します。 もしボックスの高さがある部屋の高さより大きい場合、そのボックスおよびそれよ
-
Pythonでリスト内の最小値を見つける方法を解説
この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。