ICPC WF 연습 (2/11)

Hard Refactoring

부등식 여러 개가 주어지면, 이를 동치이면서 최대한 짧은 하나의 부등식으로 표현하는 문제이다.

그냥 열심히 짜면 된다.

Bin

각 정점에 대해 왼쪽 부트리의 크기가 오른쪽 부트리의 크기 + KK 이하인, NN개의 잎을 가진 Full binary tree의 개수를 세는 문제이다.

N=nN = n일 때의 답을 DnD_n이라고 하자. 자명하게, D0=D1=1D_0 = D_1 = 1이다.

다음과 같은 점화식은 쉽게 관찰할 수 있다: Dn=∑l=1⌊(n+K)/2⌋DlDn−lD_n = \sum_{l = 1}^{ \lfloor { (n+K) / 2 } \rfloor } D _l D _{n - l}

KK가 아주 작으므로, 식을 다음과 같이 변형할 수 있다: Dn=12∑l=1nDlDn−l+O(K)개의 항D_n = \frac{1}{2} \sum_{l = 1}^{ n } D _l D _{n - l} + O(K)\text{개의 항}

이제, Online FFT Technique을 적용하면, O(NKlg⁡N)O\left( NK \lg N \right)에 해결할 수 있다.

Cat

두 문자열 AA, BB가 주어질 때, A[a⋯ ]+B[⋯b]A[a \cdots ] + B[ \cdots b] 꼴의 서로 다른 문자열의 개수를 세는 문제이다.

SA를 이용하면 풀린다고 한다. 나는 모르겠다.

Exp

K+1K+1개의 음이 아닌 실수 P0,P1,⋯ ,PKP_0, P_1, \cdots, P_K가 주어질 때, 다항식 (P0+P1x+P2x2+⋯+PKxK)N\left( P_0 + P_1 x + P_2 x^2 + \cdots + P_K x^K \right)^N에서, x0,x1,⋯ ,xT−1x^0, x^1, \cdots, x^{T-1}의 계수를 모두 구하는 문제이다.

구해야 하는 다항식을 P(x)P(x)라고 하자. 또한, PN=c0x0+c1x1+⋯+cTxT+⋯P^N = c_0 x^0 + c_1 x^1 + \cdots + c_T x^T + \cdots 라고 하자.

NPNP′=(PN)′PN P^N P' = \left( P^N \right)' P이므로, 계수 비교를 하면, cic_i를 ci−K−1,⋯ ,ci−1c _{i-K-1}, \cdots, c _{i-1}의 선형 결합으로 표현할 수 있다.

따라서, 전체 시간 복잡도는 O(TK)O\left( TK \right)이다.

Grp

NN개의 알파벳 중 KK개 이하의 알파벳을 뽑아 만들 수 있는 모든 집합을, 다음 조건을 만족하도록 최소 개수의 그룹으로 나누어야 한다:

  • 각 집합은 정확하게 하나의 그룹에만 속한다.
  • 하나의 그룹에 속하는 모든 집합은 서로소이다.
  • 하나의 그룹에 속하는 모든 집합의 크기의 합은 KK 이하이다.

KK가 홀수일 때를 풀어보자. 답의 자명한 상한을 생각하자. 크기가 K/2K/2 초과인 집합은 같은 그룹에 속할 수 없다. 따라서, 답은 (N(K+1)/2)+⋯+(NK)\binom{N}{(K+1)/2} + \cdots + \binom{N}{K}보다 작을 수 없다.

이제, 제시한 상한을 답으로 가지는 해를 만들자. 1≤x<K/21 \le x < K/2이면 (Nx)≤(NK−x)\binom{N}{x} \le \binom{N}{K-x}이므로, 크기가 xx인 집합과 K−xK-x인 집합 사이에 Matching을 구하면 된다.

이제, KK가 짝수일 때를 관찰하자. 크기가 K/2K/2인 집합을 두 개씩 묶어 최대한 많은 그룹을 만들어야 한다. 이는 General Matching을 구하면 해결할 수 있다. 놀랍게도, N≤17N \le 17이면, 항상 Perfect Matching이 존재해서, 이 논리는 유효하다.

이를 잘 구현하면, 모든 입력에 대해 상당히 빠른 시간 안에 답이 잘 나온다.