Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Kotlin
- 백준 16235
- 프로그래머스
- java
- Coroutine
- Spring
- 백준 17626
- spring oauth
- 백준 17779
- re.split
- 백준
- 백준 파이썬
- 백준 15685
- MSA
- 백준 16236
- 백준 19238
- java 기술면접
- JPA
- 파이썬
- with recursive
- 프로래머스
- 웹어플리케이션 서버
- MySQL
- 백준 16719
- springboot
- JVM
- sql 기술면접
- spring cloud
- spring security
- Spring Boot
Archives
- Today
- Total
시작이 반
[백준] 2981번 (python 파이썬) 본문
SMALL
수학적 이론이 필요한 문제이다.
M 을 찾아야한다.
A = M * a + R
B = M * b + R
C = M * c + R
여기서 R을 제거하면
A - B = M ( a - b )
B - C = M ( b - c )
이런 식이 나온다.
즉,
M은 A-B, B-C의 공약수이다 즉 최대공약수를 구하면 된다.
최대 공약수를 구하고 해당 수의 1을 제외한 약수를 출력하면된다.
이때 최대 공약수를 구하고 약수를 구할때 반복문을 최대공약수 까지 돌려버리면 숫자 범위가 1,000,000,000까지기 때문에 엄청난 시간이 걸린다.
그래서 공약수를 구할때
18 % 2 = 0 ( 2 = 약수)
18 // 2 = 9 ( 9 = 약수)
이 2개를 한번에 구한다 이러면 반복횟수를 최대공약수의 제곱근 까지 줄일수 있다.
마지막에 자기 자신도 추가한다.
from math import gcd
from math import sqrt
n = int(input())
ns = list(int(input()) for _ in range(n))
ns.sort()
interval = list()
ans = list()
for i in range(1, n):
interval.append(ns[i] - ns[i - 1])
prev = interval[0]
for i in range(1, len(interval)):
prev = gcd(prev, interval[i])
for i in range(2, int(sqrt(prev)) + 1): #제곱근까지만 탐색
if prev % i == 0:
ans.append(i)
ans.append(prev//i)
ans.append(prev)
ans = list(set(ans)) #중복이 있을수 있으니 제거
ans.sort()
print(*ans)
LIST
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 9375번 (python 파이썬) (0) | 2021.03.03 |
---|---|
[백준] 2004번 (python 파이썬) (2) | 2021.03.03 |
[백준] 1541번 (python 파이썬) (0) | 2021.03.01 |
[백준] 11399번 (python 파이썬) (0) | 2021.02.28 |
[백준] 1931번 (python 파이썬) (0) | 2021.02.28 |