[BOJ 13174] 괄호

2022. 5. 10. 16:19PS/백준

각각의 $n$에 대하여 대칭 축을 기준으로 왼쪽에 $k$쌍의 괄호가 존재하는 경우의 수를 $h(n,k)$로 정의하자. 그럼 다음이 성립한다.

\[h(n,k)=h(n-1,k-1)+h(n-1,k)\]

\[h(n,k)=0\ \ k<0\]

\[h(1,0)=1\]

증명은 직접 그려보며 이해하면 쉽다. $N$번째 괄호 대칭 문자열을 $S$라고 하고 중심축의 왼쪽 문자열을 $S1$ 중심축 오른쪽 문자열을 $S2$라고 하자. 즉, $S=S1|S2$이다. $S$는 중심축의 왼쪽에 정확히 $k$쌍의 괄호를 포함한다. 그럼 $(S)$ 역시 중심축의 왼쪽에 $k$쌍의 괄호를 포함한다. 이것이 바로 항 $h(n-1,k)$를 의미한다. $S1)|(S2$를 생각해보자. 이는 축의 양쪽에 괄호 쌍의 개수를 1개 늘려준다. 이것이 항 $h(n-1,k-1)$을 의미하는 것이다.

색깔이 $K$개가 주어졌다고 하자. 만약 대칭 축 기준으로 왼쪽에 $k$쌍의 괄호가 있다면 색칠하는 경우의 수는 $K^{n-k}$가 된다. 그럼 $K^{n-k}h(n,k)$를 모두 더하는 것이 우리가 원하는 답이다. 이것을 $s(n)$이라 하자. 또한 어떤 $n$에 대해 대칭 축 기준으로 한쪽에만 존재할 수 있는 최대의 괄호 쌍의 개수를 $L(n)$이라 정의하자.

\[s(n)=\sum_{i=0}^{L(n)} K^{n-i}h(n,i)\]

또한 $L(2n)=L(2n+1)=n$이라는 사실을 쉽게 알 수 있다.

\[s(2n+1)/K=\sum_{i=0}^{n}K^{2n-i}h(2n+1,i)\]

\[s(2n)=\sum_{i=0}^{n}K^{2n-i}h(2n,i)\]

\[s(2n+1)/K-s(2n)=\sum_{i=0}^{n} K^{2n-i}h(2n,i-1)=\sum_{i=0}^{n} K^{2n-1-i}h(2n,i)=s(2n)/K-K^{n-1}h(2n,n)\]

\[s(2n+1)=(K+1)s(2n)-K^{n}h(2n,n)\]

다음에 대해서도 살펴보자.

\[s(2n)=\sum_{i=0}^{n}K^{2n-i}h(2n,i)\]

\[ks(2n-1)=\sum_{i=0}^{n-1}K^{2n-i}h(2n-1,i)\]

\[s(2n)-ks(2n-1)=K^{n}h(2n,n)+\sum_{i=0}^{n-1} K^{2n-i}h(2n-1,i-1)\]

\[=K^{n}h(2n,n)+\sum_{i=0}^{n-2} K^{2n-1-i}h(2n-1,i)=s(2n-1)+K^{n}h(2n,n)-K^{n}h(2n-1,n-1)\]

$h(2n,n)$의 의미를 알아보자. 이는 중심축을 기준으로 좌우 각각 $n$개의 괄호들이 위치함을 알 수 있다.  한 쪽에 괄호를 배치하면 다른 쪽 괄호의 배치는 저절로 정해진다. 괄호를 올바르게 배열하는 경우의 수는 $C_{n}$(카탈란 수)이다. 따라서 $h(2n,n)=h(2n-1,n-1)=C_{n}$임을 알 수 있다.

\[s(2n)=(K+1)s(2n-1)\]

\[s(2n+1)=(K+1)s(2n)-K^{n}C_{n}=(K+1)^{2}s(2n-1)-K^{n}C_{n}\]

점화식 해결을 위해 양 변을 $(K+1)^{2n}$으로 나누자.

\[\frac{s(2n+1)}{(K+1)^{2n}}=\frac{s(2n-1)}{(K+1)^{2n-2}}-\left(\frac{K}{(K+1)^{2}}\right)^{n}C_{n}\]

\[b_{n}=\frac{s(2n+1)}{(K+1)^{2n}}\]

\[b_{n}=b_{n-1}-\left(\frac{K}{(K+1)^{2}}\right)^{n}C_{n}\]

\[b_{n-1}-b_{n}=\left(\frac{K}{(K+1)^{2}}\right)^{n}C_{n}\]

\[K-b_{n}=\sum_{i=1}^{n} \left(\frac{K}{(K+1)^{2}}\right)^{i}C_{i}\]

\[b_{n}=K-\sum_{i=1}^{n}\left(\frac{K}{(K+1)^{2}}\right)^{i}C_{i}\]

\[\therefore s(2n+1)=K(K+1)^{2n}-\sum_{i=1}^{n} K^{i} (K+1)^{2n-2i} C_{i}\]

이것은 $O(n\log(n))$으로 해결할 수 있다. 

 

더보기

# 코드 보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
typedef long long ll;
ll mod=1e9+7;
ll fpow(ll n,ll k){
    ll s=1;
    for(;k;k>>=1){
        if(k&1) s=s*n%mod;
        n=n*n%mod;
    }
    return s;
}
int main(){
    ll i,n,ans=0,K,card=1,end;
    scanf("%lld %lld",&n,&K);
    end=n/2;
    if(n%2==0end-=1;
    ans=K*fpow(K+1,2*end)%mod;
    for(i=1;i<=end;i++){
        ll t=fpow(K+1,2*end-2*i)*fpow(K,i)%mod*card%mod;
        card=card*(4*i+2)%mod*fpow(i+2,mod-2)%mod;
        ans-=t;
        ans%=mod;
    }
    if(n%2==0) ans=(K+1)*ans%mod;
    printf("%lld",(ans+mod)%mod);
}
cs

# 닫기

 

*(번외) 만약 $K=1$이라면 어떻게 될까?

\[\mathbf{Claim.} \ \ \ s(2n+1)={2n+1 \choose n}\]

\[n=1\ \ \  4-C_{1}=3={3 \choose 1}\]

$n=k$일 때 claim이 성립한다 가정하자. 그럼 다음과 같다.

\[4^{k}-(4^{k-1}C_{1}+4^{k-2}C_{2}+...+C_{k})={2k+1 \choose k}\]

양 변에 4를 곱한 후 $C_{k+1}$을 빼자.

\[4^{k+1}-(4^{k}C_{1}+4^{k-1}C_{2}+...+4C_{k}+C_{k+1})=4{2k+1 \choose k}-C_{k+1}\]

\[RHS=\frac{4(2k+1)!}{k!(k+1)!}-\frac{(2k+2)!}{(k+1)!(k+1)!(k+2)}\]

\[=\frac{(2k+1)!}{(k+1)!}\cdot \frac{4k+6}{k+2}\]

\[=\frac{(2k+3)!}{(k+2)!(k+1)!}={2k+3 \choose k+1}\]

수학적 귀납법에 의해 증명 되었다. $K=1$이 아닐 경우에 뭐가 될까요? 증명하신 분은 연락 주세여^^

'PS > 백준' 카테고리의 다른 글

[BOJ 17372] 피보나치 수의 최대공약수의 합  (0) 2022.06.16
[BOJ 18151] DivModulo  (0) 2022.05.16
[BOJ 7938] Mniam mniam  (0) 2022.05.10
[BOJ 3752] 최대공약수 행렬식  (0) 2022.04.14
[BOJ 20202] Euklid  (2) 2022.04.13