부등식 여러 개가 주어지면, 이를 동치이면서 최대한 짧은 하나의 부등식으로 표현하는 문제이다.
그냥 열심히 짜면 된다.
각 정점에 대해 왼쪽 부트리의 크기가 오른쪽 부트리의 크기 + K 이하인, N개의 잎을 가진 Full binary tree의 개수를 세는 문제이다.
N=n일 때의 답을 Dn이라고 하자. 자명하게, D0=D1=1이다.
다음과 같은 점화식은 쉽게 관찰할 수 있다: Dn=∑l=1⌊(n+K)/2⌋DlDn−l
K가 아주 작으므로, 식을 다음과 같이 변형할 수 있다: Dn=21∑l=1nDlDn−l+O(K)개의 항
이제, Online FFT Technique을 적용하면, O(NKlgN)에 해결할 수 있다.
두 문자열 A, B가 주어질 때, A[a⋯]+B[⋯b] 꼴의 서로 다른 문자열의 개수를 세는 문제이다.
SA를 이용하면 풀린다고 한다. 나는 모르겠다.
K+1개의 음이 아닌 실수 P0,P1,⋯,PK가 주어질 때, 다항식 (P0+P1x+P2x2+⋯+PKxK)N에서, x0,x1,⋯,xT−1의 계수를 모두 구하는 문제이다.
구해야 하는 다항식을 P(x)라고 하자. 또한, PN=c0x0+c1x1+⋯+cTxT+⋯라고 하자.
NPNP′=(PN)′P이므로, 계수 비교를 하면, ci를 ci−K−1,⋯,ci−1의 선형 결합으로 표현할 수 있다.
따라서, 전체 시간 복잡도는 O(TK)이다.
N개의 알파벳 중 K개 이하의 알파벳을 뽑아 만들 수 있는 모든 집합을, 다음 조건을 만족하도록 최소 개수의 그룹으로 나누어야 한다:
- 각 집합은 정확하게 하나의 그룹에만 속한다.
- 하나의 그룹에 속하는 모든 집합은 서로소이다.
- 하나의 그룹에 속하는 모든 집합의 크기의 합은 K 이하이다.
K가 홀수일 때를 풀어보자. 답의 자명한 상한을 생각하자. 크기가 K/2 초과인 집합은 같은 그룹에 속할 수 없다. 따라서, 답은 ((K+1)/2N)+⋯+(KN)보다 작을 수 없다.
이제, 제시한 상한을 답으로 가지는 해를 만들자. 1≤x<K/2이면 (xN)≤(K−xN)이므로, 크기가 x인 집합과 K−x인 집합 사이에 Matching을 구하면 된다.
이제, K가 짝수일 때를 관찰하자. 크기가 K/2인 집합을 두 개씩 묶어 최대한 많은 그룹을 만들어야 한다. 이는 General Matching을 구하면 해결할 수 있다. 놀랍게도, N≤17이면, 항상 Perfect Matching이 존재해서, 이 논리는 유효하다.
이를 잘 구현하면, 모든 입력에 대해 상당히 빠른 시간 안에 답이 잘 나온다.