※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1670번 문제인 정상 회담 2이다.
문제는 아래 링크를 확인하자.

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

 

1670번: 정상 회담 2

첫째 줄에 정상 회담에 참가한 사람의 수 N이 주어진다. 이 값은 10,000보다 작거나 같은 짝수이다.

www.acmicpc.net

2N명의 대표가 모여있고, 그 중 한 소국가의 대표 A를 정하여 상황을 분석해보자.

 

이 대표가 어떤 후보와 악수를 하느냐에 따라, 양쪽으로 0 / 2N-2, 2 / 2N-4, 4 / 2N-6, ... , 2N-2 / 0명의 대표들이 있는 상황이 생길 것임을 알 수 있다. (홀수/홀수로 나누어진다면 악수를 하지 못하는 대표들이 생긴다.)

 

각 상황의 경우를 X / Y 로 나타낸다면, 구하는 경우의 수는 X명의 대표가 악수를 하는 경우의 수와 Y명의 대표가 악수를 하는 경우의 수의 곱들을 모두 합한 것으로 계산할 수 있을 것임을 알 수 있다. (이 점화식을 만족하는 수는 카탈란 수(Catalan Number)임이 잘 알려져있으나, 나누는 수 987654321은 소수가 아니므로 modulo에 대한 역원을 이용한 조합계산을 이용하기는 어렵다.)

 

위의 점화관계를 이용하여 dp를 하면 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

long long dp[5001];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	dp[0] = 1;

	int N; cin >> N;
	N /= 2;

	for (int i = 1; i <= N; i++) {
		int L = 0, R = i - 1;
		while (L < i) {
			dp[i] += (dp[L++] * dp[R--]) % 987654321;
		}
		dp[i] %= 987654321;
	}
	
	cout << dp[N];
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1343 // C++] 폴리오미노  (0) 2021.06.15
[BOJ 10422 // C++] 괄호  (0) 2021.06.14
[BOJ 1057 // C++] 토너먼트  (0) 2021.06.12
[BOJ 16443 // C++] Bolinhas de Gude  (0) 2021.06.11
[BOJ 18250 // C++] 철도 여행  (0) 2021.06.10

+ Recent posts