Tag: math
All the articles with the tag "math".
이고 를 로 나눈 나머지를 이라 하자. ()
의 최대 공약수를 라고 하면, 다음이 성립한다.
출처: wikipidia
이 0이 될 때 알고리즘을 멈추며, 이 때의 가 최대공약수가 된다.
예를 들어 1460과 1037에 대해 알고리즘을 진행해보면 다음과 같다.
\begin{flalign*} (1460, 1037)\\=(1037, 323)\\=(323, 68)\\=(68, 52)\\=(52, 16)\\=(16, 4)\\=(4,0) \end{flalign*}이 0일때 가 4이므로 1460과 1037의 최대공약수는 4이다.
유클리드 호제법
유클리드 호제법은 2개의 자연수에 대해 최대공약수를 구하는 알고리즘이며 다음과 같은 성질을 통해 알고리즘을 진행한다.
- 좌표와 반지름은 모두 정수
행성계를 꼭 통과해야 하는 조건을 먼저 찾는. 출발점이나 도착점이 행성계 안에 있을 경우 무조건 그 항성계를 통과해야 한다. 출발점이나 도착점을 포함하지 않고 있는 행성계는 어떻게든 피해갈 수 있기 때문이다.
한 점이 원 안에 포함되어있는지 확인하려면, 원의 반지름과 원의 중심과 그 점 사이의 거리를 비교하면 된다. 원의 반지름이 더 크다면 그 점은 무조건 원 안에 위치하게 되고, 원의 중심과 그 점 사이의 거리를 비교하면 그 점은 원 밖에 위치하게 된다.
t = int(input())
for _ in range(t):
cnt = 0
x1, y1, x2, y2 = map(int, input().split())
n = int(input())
for _ in range(n):
c_x, c_y, r = map(int, input().split())
r = r ** 2
dis1 = (c_x - x1) ** 2 + (c_y - y1) ** 2
dis2 = (c_x - x2) ** 2 + (c_y - y2) ** 2
if (dis1 < r and dis2 < r) or (dis1 > r and dis2 > r):
continue
else:
cnt += 1
print(cnt)어린 왕자
백준 1004번 '어린 왕자' (실버 3) 문제 풀이. math, geometry 로 접근했다.
div = list(map(int, input().split()))
min, max = float('inf'), float('-inf')
for d in div:
if min > d : min = d
if max < d : max = d
print(min * max)약수
백준 1037번 '약수' (브론즈 1) 문제 풀이. math, number theory 로 접근했다.
nums = {1 : [1],
2 : [2, 4, 8, 6],
3 : [3, 9, 7, 1],
4 : [4, 6],
5 : [5],
6 : [6],
7 : [7, 9, 3, 1],
8 : [8, 4, 2, 6],
9 : [9, 1]}
for _ in range(n):
a, b = map(int, input().split())
# a의 1의 자리수를 구한다 -> 4
one = a % 10
# 1의 자리에 나올 수 있는 값들을 가져온다 -> nums[4] -> [4, 6]
# 이 중에서 b번째 값을 취한다. 4, 6, 4, 6, 4, 6 -> 6
print(nums[one][(b - 1) % len(nums[one])])
단 a의 1의 자리가 0일 경우 무조건 제곱한 수의 1의 자리도 0이므로 10번 컴퓨터가 처리하게 된다.
분산 처리
백준 1009번 '분산 처리' (브론즈 2) 문제 풀이. math, implementation 로 접근했다.
import sys, math
i = int(sys.stdin.readline())
for _ in range(i):
n, m = map(int, sys.stdin.readline().split())
N = m - n
r_N = math.sqrt(N)
N_int = math.trunc(r_N)
if r_N == N_int: print(N_int * 2 - 1)
else:
if N > N_int * (N_int + 1):
print(N_int * 2 + 1)
else:
print(N_int * 2)Fly me to the Alpha Centauri
백준 1011번 'Fly me to the Alpha Centauri' (골드 5) 문제 풀이. math 로 접근했다.
nums = str(sys.stdin.readline().strip())
if '0' not in nums:
print(-1)
else:
l = [0] * (int(max(nums)) + 1)
s = ''
sum = 0
for i in nums:
l[int(i)] += 1
for i in range(len(l)-1, 0, -1):
s += str(i) * l[i]
sum += i * l[i]
if sum % 3 == 0: print(int(s) * (10 ** l[0]))
else: print(-1)30
백준 10610번 '30' (실버 5) 문제 풀이. math, string, greedy algorithm 로 접근했다.