문제는 solved.ac 난이도 순이다. 전체적으로 난이도는 Platinum I ~ Ruby IV 정도로 높은 편이다.


BOJ 7737 삼각분할

BOJ 13127 도박과 사각형

BOJ 18151 DivModulo

BOJ 3435 Justice for All

BOJ 1665 화물열

BOJ 17643 Amusement Park

BOJ 10912 The Last Wizard

BOJ 17646 제곱수의 합 2 (More Huge)



'PS > 수학 계열 PS' 카테고리의 다른 글

Project Euler 450문제  (0) 2020.02.08
1월 PS 정리 - Part 2  (0) 2020.01.26
Project Euler 400문제  (0) 2019.12.13
Project Euler 350문제  (0) 2019.12.02
Project Euler 691  (1) 2019.12.01

Ramsey Number는 이산수학에서 중요하게 다뤄지는 주제 중 하나다. 


Ramsey Number \(R(n, m)\)는 정점이 \(V\)개인 완전그래프 \(G\)의 간선을 빨간색/파란색 중 하나로 색칠할 때, 빨간색 간선으로만 이루어진 완전그래프 \(K_n\) 또는 파란색 간선으로만 이루어진 완전그래프 \(K_m\)이 존재하게 되는 \(V\)의 최솟값으로 정의된다. 


이를 확장해서, 그래프 \(G_1, G_2\)에 대해 \(R(G_1, G_2)\)를 정점이 \(V\)개인 완전그래프 \(G\)의 간선을 빨간색/파란색 중 하나로 색칠할 때, 빨간색 간선으로만 이루어진 \(G_1\) 또는 파란색 간선으로만 이루어진 \(G_2\)가 존재하게 되는 \(V\)의 최솟값으로 정의하자.


본 포스팅에서는 1977년에 증명된 다음 정리를 증명한다. 


Theorem: (V. Chvatal) 

임의의 정점 \(n\)개를 가진 트리 \(T_n\)과 완전그래프 \(K_m\)에 대해서, \(R(T_n, K_m) = (n-1)(m-1)+1\)이 성립한다.


Theorem 증명

이제부터 빨간색 간선만 간선으로 본다. 즉, 이제부터 \(G\)는 빨간색 간선으로만 이루어진 그래프다. 

마찬가지로, \(\overline{G}\)는 파란색 간선으로만 이루어진 그래프다. 먼저 \(R(T_n, K_m) \ge (n-1)(m-1)+1\)을 보인다.

\(K_{n-1}\)을 \(m-1\)개 깔아놓은 것을 \(G\)라 하면, \(G\)는 \(T_n\)을 포함하지 않고 \(\overline{G}\)는 \(K_m\)을 포함하지 않는다. 

그러니 \(R(T_n, K_m) > |V(G)| = (n-1)(m-1)\)이 되고 \(R(T_n, K_m) \ge (n-1)(m-1)+1\)을 얻는다.


이제 \(R(T_n, K_m) \le (n-1)(m-1)+1\)이 성립함을 증명하자.

즉, \((n-1)(m-1)+1\)개의 정점을 가진 그래프 \(G\)가 있다면, \(G\)가 \(T_n\)을 포함하거나 \(\overline{G}\)가 \(K_m\)을 포함함을 증명하자. 

\(\overline{G}\)가 \(K_m\)을 포함하지 않으면, \(G\)가 \(T_n\)을 포함함을 보이면 된다. 


보조정리 3개가 필요하다. 대부분 well-known인 것 같다. 


그래프 \(H\)의 채색수를 \(\chi(H)\)라 하고, 최대 독립집합의 크기를 \(\alpha(H)\)라 하자.


Lemma 1. \(\chi(H) \cdot \alpha(H) \ge |V(H)|\)가 성립한다. 


Proof of Lemma 1. \(\chi(H)\)개의 색깔로 그래프를 색칠하면, 각 색으로 칠해진 정점의 집합은 각각 독립집합이 된다. 

이제 비둘기집의 원리를 적용하면 증명이 간단하게 끝난다.


Lemma 2. \(H\)의 적당한 부분그래프 \(H'\)이 존재하여, \(H'\)의 각 정점의 차수가 \(\chi(H)-1\) 이상이다. 


Proof of Lemma 2. 채색수를 유지하면서 정점을 삭제하는 것을 반복하자. 이 과정이 멈추면, 어떤 정점을 삭제해도 채색수가 감소하는 그래프를 얻게 된다. 이 그래프를 \(H'\)이라 하면, \(H'\)이 원하는 조건을 만족함을 보이자.

\(H'\)에 속하는 정점 \(v\)가 있어, \(H'\)에서 \(v\)의 차수 \(d\)가 \(\chi(H)-2\) 이하라고 가정하자. 

한편, \(H'\)의 성질에 의해서 \(H' - \{v\}\)는 \(\chi(H)-1\)개의 색으로 색칠할 수 있다. 

이제 \(d \le \chi(H)-2\)가 성립하므로, \(H' - \{v\}\)를 \(\chi(H)-1\)개의 색으로 색칠한 뒤 \(v\)를 적당한 색으로 칠해서 \(H'\) 전체를 \(\chi(H)-1\)개의 색으로 칠할 수 있게 된다. 그런데 \(\chi(H) = \chi(H')\)이 성립하므로, 이는 모순이다.


Lemma 3. \(H\)의 각 정점의 차수가 \(n-1\) 이상이면, \(H\)는 임의의 정점 \(n\)개를 가진 트리 \(T_n\)을 부분그래프로 가진다.


Proof of Lemma 3. \(n\)에 대한 귀납법. \(n \le 2\)까지는 자명하다. 

이제 임의의 정점 \(n\)개를 가진 트리 \(T_n\)을 하나 준비하고, 트리의 리프 노드 \(v\)를 하나 잡자.

귀납 가정에 의해서, \(H\)는 \(T_n - \{v\}\)를 포함한다. 한편, \(H\)의 각 정점의 차수가 \(n-1\) 이상이므로 적당하게 리프 노드 \(v\)를 \(H\)에서 찾은 \(T_n - \{v\}\)에 붙일 수 있다. 그러니 \(H\)는 \(T_n\)을 포함하고, 귀납법에 의해서 증명 끝.


이제 모든 준비가 끝났다. 본격적인 증명을 시작하자.


\(\overline{G}\)가 \(K_m\)을 포함하지 않는다는 것은 \(\alpha(G) < m\)이 성립한다는 것과 동치이다.

\(|V(G)|=(n-1)(m-1)+1\)이니, Lemma 1에 의해서 \(\chi(G) \ge n\)을 얻는다. 

Lemma 2에 의해서, \(G\)의 부분그래프 \(H\)가 존재하여 \(H\)의 각 정점의 차수가 \(n-1\) 이상이다.

Lemma 3에 의해서, \(H\)는 \(T_n\)을 부분그래프로 가진다. 즉, \(G\)는 \(T_n\)을 부분그래프로 가진다.


여기서 \(R(T_n, K_m) \le (n-1)(m-1)+1\)을 얻고, 이제 \(R(T_n, K_m) = (n-1)(m-1)+1\)을 얻어 증명 끝.


 



'수학 > 기타 재밌는 것들' 카테고리의 다른 글

Graham-Pollak Theorem  (0) 2018.10.09


문제 풀이는 문제 당 간단한 힌트를 몇 개 올리는 것으로 대체할 예정이다. 특별히 재밌었던 문제는 풀이를 완전히 올릴 수도.

'PS > 수학 계열 PS' 카테고리의 다른 글

1월 PS 정리 - Part 2  (0) 2020.01.26
12월 말 PS 정리 - Part 2  (0) 2019.12.25
Project Euler 350문제  (0) 2019.12.02
Project Euler 691  (1) 2019.12.01
BOJ #9267 - A + B (SEERC 2013)  (2) 2019.11.24

어쩌다가 여기까지 왔다. 이제 학교 공부해야지...



'PS > 수학 계열 PS' 카테고리의 다른 글

12월 말 PS 정리 - Part 2  (0) 2019.12.25
Project Euler 400문제  (0) 2019.12.13
Project Euler 691  (1) 2019.12.01
BOJ #9267 - A + B (SEERC 2013)  (2) 2019.11.24
Project Euler 300문제  (0) 2019.11.23

https://projecteuler.net/problem=691


Top 10에 처음 들었다. 뇌절을 좀 했는데 풀이 생각을 빨리 해서 그나마 어떻게 잘 풀린듯.



'PS > 수학 계열 PS' 카테고리의 다른 글

Project Euler 400문제  (0) 2019.12.13
Project Euler 350문제  (0) 2019.12.02
BOJ #9267 - A + B (SEERC 2013)  (2) 2019.11.24
Project Euler 300문제  (0) 2019.11.23
9월초 수학 PS 일지  (3) 2019.09.11

2019/12/13 ~ 2020/03/01


  • 정보처리기능사 필기 따기 (2월 중)
  • Project Euler 400 문제 찍기
  • 정보 겨울학교 조교 (1/6 ~ 1/17 예정)
  • 블로그 관리BOJ 문제 풀이, PE 문제 풀이
  • 김동률님의 선형대수학 책 읽기 (정확하게 Exercise 4문제 못 풀었다. 이건 천천히 봐야할 듯)
  • 과외 및 돈벌이 (방학 중에 계속 할 듯)
  • 대장금 봉사 시간 채우기 
  • Sage 간단하게 입문하기 (필요한 것 찾아서 적당히 짤 수 있을 정도로 연습 완료)



From 'Hard Normal Daddy', Warp Records (WARP50, 1997)


이게 1997년 작품이라는 게 믿기지가 않는다.

문제


스포 방지선

___________________________________________________________________________________________________________












___________________________________________________________________________________________________________


풀이


Euclidean Algorithm의 느낌으로 생각하면, \(ax+by=s\)를 만족하는 음이 아니고 서로소인 두 정수 \(x, y\)를 찾으면 된다.

(UPD: 사실 이 점을 증명하는 것도 trivial 한 것은 아니다. 머리를 좀 쓰긴 해야함) 

일반적으로 \(ax+by=s\)를 푸는 것은 Extended Euclidean Algorithm을 알면 쉽게 구현 가능하다. 

\(\text{gcd}(a, b)=1\)이 되도록 식을 reduce 시키고, 얻은 새로운 식을 \(ax+by=s\)라고 재정의하자. 

이제 \(ax+by=1\)을 만족하는 정수 \(x, y\)를 Extended Euclidean Algorithm (Modular Inverse)으로 구할 수 있다. 

위 식을 단순하게 \(s\)배 하기만 하면, \(ax+by=s\)인 정수 \(x, y\)를 하나 찾을 수 있다. 이를 \(x_0, y_0\)라 하자.


우리는 \(ax + by=s\)가 성립하면, 정수 \(k\)에 대해 \(x = x_0 + bk\), \(y = y_0 - ak\)라고 쓸 수 있음을 안다. 

이제 \(x_0, y_0\)를 적당히 이 방식대로 바꿔서, \(x_0 < b\)가 성립하도록 할 수 있다. 

다시 \(x = x_0 + bk\), \(y= y_0-ak\)로 solution set을 parametrize하자.

\(x, y \ge 0\)이어야 하니, \(k \ge 0\)인 경우만 보면 된다는 것을 알 수 있다. 


이제 목표는 \(k \ge 0\), \(x_0+bk \ge 0\), \(y_0-ak \ge 0\), \(\text{gcd}(x_0+bk, y_0-ak)=1\)인 정수 \(k\)가 존재하는지 여부다. 

꽤 어려운 문제처럼 보이지만, 알고리즘 문제를 푸는 입장에서 solution은 간단하다. 

단순히 \(k\)에 대해서 iterate 하면서, 조건을 만족하는 \(k\)가 나오면 YES를 찍고, 아니면 NO를 찍으면 된다. 

\(k \ge 0\), \(x_0+bk \ge 0\), \(y_0-ak \ge 0\)를 만족하는 정수 \(k\)의 개수는 \(10^{18}\)-scale까지 커질 수 있다는 것을 생각하자.

이 알고리즘이 시간 안에 답을 낸다는 사실은 (구현하면 0ms 뜬다) 수학적으로 전혀 자명하지 않다.


1년 반 전에 이 문제를 풀었을 때 이 점은 개인적으로 숙제로 남아 있었다.

오늘 이 풀이가 시간 안에 도는 이유를 아는 분에게 질문 받아서, 고민을 하는 시간을 가져 해답을 찾았다.

사실 이 블로그를 쓰는 이유도 풀이를 쓰는 것보단 이 해답을 기록하기 위한 것이다. 


Claim: 문제 조건에서 \(\text{gcd}(x_0+bk, y_0-ak)=1\)을 만족하는 최소의 음이 아닌 정수 \(k\)는 최대 \(2^{15}\)이다. 


이 Claim이 증명되면, 풀이가 시간 안에 도는 이유는 자명하다. 

\(k\)에 대한 iteration이 최대 \(2^{15}\)번 돌기 때문에, 코드의 시간복잡도는 대강 \(\mathcal{O}(2^{15} \log s)\) 정도가 된다.

이 정도의 시간복잡도/상수면, 코드가 0ms 안에 도는 것도 충분히 설명된다. 


Claim 증명


자연수 \(D\)가 있어, 각 \(k=0, 1, \cdots D-1\)에 대해 \(\text{gcd}(x_0+bk, y_0-ak) \neq 1\)이라 하자.

최대공약수가 \(1\)이 아니라는 것은 공통 소인수가 있다는 것이다. 

그러니 각 \(k=0, 1, \cdots , D-1\)에 대해 \(x_0+bk\)와 \(y_0-ak\)의 공통 소인수를 아무거나 하나 잡아서 이를 \(p_k\)라 하자.  


우선 \(s \equiv ax_0 + by_0 \equiv a(x_0+bk)+b(y_0-ak) \equiv 0 \pmod{p_k}\)이므로, \(p_k|s\)를 얻는다.

즉, \(p_k\)로 가능한 소수의 개수는 유한하다. (특히, \(s \le 10^{18}\)이므로, 최대 15개가 존재한다)


\(P = p_i = p_j\)인 두 정수 \(0 \le i, j < D\)가 있다고 가정하자.

그러면 \(x_0 + bi \equiv x_0 + bj \equiv y_0 - ai \equiv y_0 - aj \equiv 0 \pmod{P}\)가 성립한다.

이를 정리하면, \(P|b(i-j)\), \(P|a(i-j)\)가 성립한다. \(\text{gcd}(a,b)=1\)이므로, \(i \equiv j \pmod{P}\)를 얻는다. 


이 시점에서 상황을 정리해보자. 

  • \(s\)의 소인수는 최대 15개가 있다. 
  • 각 \(k=0, 1, \cdots D-1\)에 대해, 소수 \(p_k\)는 \(s\)의 소인수다.
  • \(s\)의 각 소인수 \(P\)에 대해서, \(P = p_k\)인 index \(k\)의 수열은 공차가 \(P\)인 등차수열에 완전히 포함된다. 

이 상황을 약간 다르게 해석해보자.

  • \(s\)의 각 소인수 \(P\)에 대해서, \(P = p_k\)인 index \(k\)의 수열은 공차가 \(P\)인 등차수열에 완전히 포함된다. 
  • \(s\)의 각 소인수 \(P\)에 대해서, \(P = p_k\)인 index \(k\)의 수열을 포함하는 등차수열 \(\{v_P + Pn\}_{n \in \mathbb{Z}}\)를 생각하자.
  • 각 소인수에 대해서 얻은 등차수열의 합집합을 생각하면, \(0, 1, \cdots , D-1\)을 전부 cover 한다.
  • 즉, \(\{0, 1, 2, \cdots , D-1\} \subseteq \cup_{P|s, P \text{      is prime}} \{v_P + Pn\}_{n \in \mathbb{Z}} \)이다.

그런데, 중국인의 나머지 정리의 느낌으로 생각하면, \(\cup_{P|s, P \text{      is prime}} \{v_P + Pn\}_{n \in \mathbb{Z}} \)는 절대로 정수 집합 전체가 될 수 없다. 


이제 문제를 다음과 같은 느낌으로 바꾸어서 생각할 수 있다. 

  • 정수 전체를 cover 하지는 않는 등차수열이 \(k\)개가 있다. 
  • 이 등차수열들은 최대 몇 개의 연속한 자연수를 cover 할 수 있을까?

이 문제는 어느 정도 유명한 문제다. 개인적으로 아주 좋아하는 정리 중 하나를 소개한다.


Theorem: (Erdős, Crittenden, Vanden Eynden)

\(F\)는 \(k\)개의 등차수열 \(a_i + d_i \mathbb{Z}\)의 집합으로, (\(1 \le i \le k\)) \(1 < d_1 < d_2 \cdots < d_k\)다. 

만약 \(F\)가 연속한 \(2^k\)개의 정수를 cover 한다면, \(F\)는 정수 전체를 cover 하는 집합이다. 


Theorem 증명 (Taken From "Problems From The Book" pp. 152-153)

정수 \(x, x+1, \cdots x+2^k-1\)이 모두 \(F\)에 의해 cover 된다고 가정하자.

각 \(0 \le t <2^k\)에 대해서, 적당한 \(1 \le j \le k\)가 있어 \(x+t \equiv a_j \pmod{d_j}\)다. 

이를 다르게 해석하면, 각 \(0 \le t < 2^k\)에 대해서 \(\displaystyle \prod_{j=1}^k \left(1 - e^{\frac{2\pi i}{d_j} ( x+t-a_j)} \right) = 0\)라는 것이다. (동치조건이다)


이 식을 전개하면, \(\sum_{I \subset S} \alpha_I \cdot e^{(x+t) \beta_I} = 0\) 형태로 쓸 수 있음을 알 수 있다.

단, \(S = \{1, 2, \cdots k\}\)이며, \(\alpha_I\)와 \(\beta_I\)는 \(I, a_i, d_i\)에만 영향을 받는 값이다. 정확하게 말하자면, $$ \prod_{j=1}^k \left(1- e^{\frac{2\pi i}{d_j}(x+t-a_j)} \right) = \sum_{I \subset S} (-1)^{|I|} \cdot e^{-2\pi i \sum_{j \in I} a_j/d_j} \cdot e^{2\pi i (x+t) \sum_{j \in I} 1/d_j} $$이 성립한다. 이제 \(z_I = e^{\beta_I}\)라고 두면, 각 \(0 \le t < 2^k\)에 대해서 \(\sum_{I \subset S} \alpha_I z^{x+t}_I = 0\)이다. 


이제 \(u_n = \sum_{I \subset S} \alpha_I z^n_I\)라고 하자. \(u_n = 0\)인 것은, \(n\)이 \(F\)에 의해 cover 되는 것과 동치임을 정의상 알 수 있다.

식의 형태를 보면서 linear recurrence의 characteristic polynomial이 생각이 날 것이다. 

다항식 \(\displaystyle \prod_{I \subset S} (X-z_I) = X^{2^k} + A_{2^k-1} X^{2^k-1} + \cdots + A_1 X^1 + A_0\)를 생각하자.

그러면 각 \(I \subset S\)에 대해 \(z^{n+2^k}_I + A_{2^k-1} z^{n+2^k-1}_I + \cdots + A_1 z^{n+1}_I + A_0 z^n_I = 0\)이다.

이 식들을 적당히 선형결합하면, \(u_{n+2^k} + A_{2^k-1} u_{n+2^k-1} + \cdots + A_1 u_{n+1} + A_0 u_n = 0\)이다. 

한편, 이미 \(u_x = u_{x+1} = \cdots = u_{x+2^k-1} = 0\)을 알고 있으니, 모든 \(n\)에 대해서 \(u_n = 0\)임이 자명하다. 

증명 과정에서는 \(A_0 \neq 0\)이라는 (자명한) 사실이 사용된다. 나머지는 전형적인 귀납법. 증명 끝. 


이제 끝났다. 지금까지의 관찰을 합쳐서, \(D \le 2^{15}\)임을 알 수 있다. 증명 끝.


Note. 관련된 문제인 RMM 2010 Problem 1을 참고하면 도움이 될 것 같다. 출제자는 Dan Schwarz.



'PS > 수학 계열 PS' 카테고리의 다른 글

Project Euler 350문제  (0) 2019.12.02
Project Euler 691  (1) 2019.12.01
Project Euler 300문제  (0) 2019.11.23
9월초 수학 PS 일지  (3) 2019.09.11
7-8월의 수학 PS 일지  (3) 2019.08.28