AtCoder Regular Contest 051 B – 互除法 をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Regular Contest 051 B – 互除法

問題文そのものにC++のソースが含まれている、変な問題。こういった問題はもう出ないんじゃないかな……。要するにユークリッドの互除法が終了するまでの回数を指定されたときの、元の2つの数を作成する問題。

# AtCoder Regular Contest 051 B - 互除法
# https://atcoder.jp/contests/arc051/tasks/arc051_b
# tag: ユークリッドの互除法 考察

# 問題の C++ を Python で書くとこんな感じだろうか。

# counter = 0
# def gcd(a, b):
# global counter
# if b == 0:
# return a
# counter += 1
# return gcd(b, a % b)

# def main():
# a, b = map(int, input().split())
# gcd(a, b)
# print(counter)

# 仮に 24 9 を入力したとすると、a, b, counter は
# 24, 9, 0
# 9, 6, 1
# 6, 3, 2
# 3, 0, 3
# と変化していき、3 が帰ってくる。

# さて、結論からいうと、
# 1, 0, K
# 2, 1, K-1
# 3, 2, K-2
# 5, 3, K-3
# ...
# という具合に遡っていってやればいい。

# 注意:
# 初期値を 1, 1 にすると、
# 1, 0, K
# 1, 1, K-1
# 2, 1, K-2
# となるが 2, 1 の次は本当は 1, 0 になるはずなので、
# きちんと動かない。

def main():
K = int(input())

a, b = 2, 1
for k in range(K-1):
a, b = a + b, a
print(a, b)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です