[PS] 백준 10166번 관중석

고범수·2022년 11월 23일
0

Problem Solving

목록 보기
3/31

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

동심원의 선위에 좌석을 배치하는데, 각도가 같은 위치에 있는 좌석들은 맨 앞 좌석에 의해 가려진다.
그래서 각 좌석의 각도를 구해놓고 비교해야 하는데, 소수로 나타내면 정밀도 문제로 비교할 수가 없다.
그렇다면? 기약분수로 나타내자.

잠시 잊고 있었을 수 있지만 기약분수는 분모와 분자의 최대공약수로 분모와 분자를 나누어 주면 구할 수 있다.
유클리드 호제법을 이용해 최대공약수를 구하면 되겠다.

#include <iostream>

using namespace std;

int d1, d2, ans;
bool seats[2001][2001];

int gcd(int x, int y) {
	return y == 0 ? x : gcd(y, x % y);
}

int main() {
	cin >> d1 >> d2;

	for (int denominator = d1; denominator <= d2; denominator++) {
		for (int numerator = 0; numerator < denominator; numerator++) {
			int g = gcd(denominator, numerator);
			if (seats[numerator / g][denominator / g]) {
				continue;
			}
			ans++;
			seats[numerator / g][denominator / g] = true;
		}
	}

	cout << ans << '\n';
}

0개의 댓글