유클리드 호제법
2개의 자연수 또는 정식의 최대 공약수를 구하는 알고리즘의 하나.
2개의 자연수 a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a > b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다.
def gcd(a, b):
while b > 0:
a, b = b, a % b
return a
숫자 a, b가 있을 때 계속해서 a에 b, b에 a%b를 대입시키고, b가 0될 때까지 반복하면 a와 b의 최대 공약수를 구할 수 있다.
python에서는 math 라이브러리에서 gcd를 제공한다.
def lcm(a, b):
return a * b / gcd(a, b)
a*b 값을 gcd(a, b)로 나누면 최소 공배수를 구할 수 있다.
math.lcm 역시 제공
import sys
input = sys.stdin.readline
a, b = map(int, input().split())
c, d = map(int, input().split())
denominator = b * d
numerator = a * d + b * c
def gcd(a, b):
while b > 0:
a, b = b, a % b
return a
GCD = gcd(numerator, denominator)
print(numerator//GCD, denominator//GCD)
분모: denominator
분자: numerator
유클리드 호제법을 이용하지 않으면 시간 초과가 발생한다.
import sys
from math import gcd
input = sys.stdin.readline
N = int(input())
compare_tree = int(input())
arr = []
for _ in range(N-1):
tree = int(input())
arr.append(tree - compare_tree)
compare_tree = tree
g = arr[0]
for i in range(len(arr)):
g = gcd(g, arr[i])
result = 0
for x in arr:
result += x // g - 1
print(result)
arr에 compare_tree로 비교하며 각 가로수들 사이의 간격을 모두 저장하고, gcd를 이용해 모든 가로수들 사이 간격의 최대 공약수를 찾는다.
개수 = 간격 // 최대 공약수 - 1
로 사이에 심을 가로수의 개수를 구한다.
https://donggyu.tistory.com/128
https://hi-rachel.tistory.com/101