열렬히.뛰기

2981번 : 검문

알고리즘: 실전 > 백준 단계별로 풀기: 10번 ~ 25번 > 2981번 : 검문

아이디어

a_{1} \div d = p_{1} \cdots left

a_{2} \div d = p_{2} \cdots left

a_{3} \div d = p_{3} \cdots left

둘의 차를 구해보면?

(a_{1} - a_{2}) = d \cdot (p_{1} - p_{2})

(a_{2} - a_{3}) = d \cdot (p_{2} - p_{3})

즉, 차들의 공약수가 d임을 알 수 있다.

푸는 방법

  1. 수를 정렬한다.
  2. 각 수들의 차를 구한다
  3. 차들의 최대공약수를 구한다.
  4. 그 최대공약수의 약수들을 구한다.

코드

python
"""검문"""
n = int(input())
number, gap = [], []
for _ in range(n):
    number.append(int(input()))
number.sort()

for i in range(1, n):
	gap.append(number[i] - number[i-1])

# 최대공약수 구하기
def find_gcd(a, b):
    while b > 0:
        a, b = b, a % b
    return a

def gcd_n(arr):
    gcd = arr[0]
    for item in arr:
        gcd = find_gcd(gcd, item)
    return gcd

x = gcd_n(gap)
ans = []

# 약수 구하기
for i in range(2, x+1):
    if x % i == 0:
        ans.append(i)

for i in ans:
    print(i, end=" ")