파게로그

[백준 2168번] 타일 위의 대각선 본문

콤퓨타 왕왕기초/PS

[백준 2168번] 타일 위의 대각선

파게 2020. 11. 3. 00:03

문제 링크: 2168번 타일 위의 대각선

https://www.acmicpc.net/problem/2168

 

가로 길이를 x, 세로 길이를 y라 하고 GCD(x, y) = G라 하면,

x = GX, y = GY와 같이 표현할 수 있다.

이 때 대각선의 기울기는 y/x = GY/GX = Y/X이고,

가로로 X칸, 세로로 Y칸 이동할 때마다 타일의 경계점과 만난다.

 

대각선 위에 X*Y의 사각형은 G개 있고,

대각선을 우하향으로 그린다고 할 때 그려진 타일은 반드시 왼쪽 상단에서 우측 하단으로 한 칸씩 이동하므로

각 사각형마다 x+y-1개의 타일에 대각선이 지나간다.

 

따라서 대각선이 그려져 있는 타일의 개수는 G*(X+Y-1)개이다.

 

여기서 최대공약수를 빨리 구하는 방법을 헤맸는데 유클리드 호제법을 떠올려야 한다.

임의의 정수 a, b(a>b)에 대하여 GCD(a, b)=G(a%b, a)이다.

a 또는 b가 0일 때까지 재귀적으로 함수를 적용해줌으로써 최대공약수를 빠르게 구할 수 있다.

증명은 여기에서 확인할 수 있다.

 

#include <iostream>

using namespace std;

int gcd(int a, int b) {
    if (a==b) return a;
    if (!a) return b;
    if (!b) return a;
    
    if (a>b) return gcd(a%b, b);
    else return gcd(a, b%a);
}

int main() {
    int m, n;
    cin >> m >> n;
    int g = gcd(m, n);
    printf("%d", gcd(m,n)*(m/g+n/g-1));
    return 0;
}

'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글

[백준 1018번] 체스판 다시 칠하기  (0) 2020.11.06
[백준 7568번] 덩치  (0) 2020.11.05
[백준 11729번] 하노이의 탑  (0) 2020.11.02
[백준 2447번] 별 찍기 10  (0) 2020.11.02
[백준 10870번] 피보나치  (0) 2020.10.30
Comments