Möbius inversion formula (BOJ 1792)

Bard·2020년 12월 4일

Algorithm

목록 보기
2/5
post-thumbnail

Möbius inversion formula
g와 f가 수론적 함수(arithmetic function)이며
g(n)=∑d∣nf(d)g(n)=\sum_{d\mid n}{f(d)} 이면 f(n)=∑d∣ng(d)μ(n/d)f(n)=\sum_{{d\mid n}}g(d)\mu (n/d) 이다.

뫼비우스 반전공식을 시작하기에 앞서 갖춰야할 사전지식들이 있다.

  1. 수론적 함수
    모든 양의 정수에서 값이 정의되는 함수로, 복소수의 수열이라고 볼 수 있다.
  2. 뫼비우스 함수
    nn이 kk개의 소인수를 갖는 제곱 인수가 없는 정수라면 μ(n)=(−1)k\mu (n)=(-1)^{k}이다.
    nn이 제곱 인수가 없는 정수가 아니라면, μ(n)=0\mu (n)=0이다.

뫼비우스 함수를 보고 제곱 ㄴㄴ 문제를 떠올리신 분도 있을 것 같다.

이 때 위에서 기술한 공식이 성립하는데, 이렇게 뫼비우스 함수가 뭔지 알고 보아도 이해가 안가는 식인건 마찬가지이다.

간단히 말하자면 g(n)g(n)이 n의 모든 양의 약수 d에 대해 f(d)f(d)의 누적합으로 표현될 때, f(n)f(n)을 g(d)g(d)를 이용해서 구할 수 있다는 말이다.

그러면 여기에서 다음과 같은 정리를 유도해낼 수 있다. 뫼비우스 반전공식에 대한 자세한 설명은 위키피디아를 참고하면 될 것 같다.

이제 공약수 문제를 다시 보자.

세 개의 정수 a,b,da, b, d가 주어지면, 다음의 세 조건을 만족하는 자연수 순서쌍 (x,y)(x, y)의 개수를 구하는 프로그램을 작성하시오.

  • 1≤x≤a1 ≤ x ≤ a
  • 1≤y≤b1 ≤ y ≤ b
  • xx와 yy의 최대공약수는 dd이다.

식으로 표현하면 다음과 같다.

∑i=1a∑j=1b[(gcd(i,j)=d]\sum^a_{i=1}\sum^b_{j=1}[(gcd(i,j)=d]

i=αd,j=βdi=\alpha d, j=\beta d라고 하자. 이 때, 위 식은 아래와 같이 쓸 수 있다.

∑α=1⌊ad⌋∑β=1⌊bd⌋i(gcd⁡(α,β))\sum_{\alpha=1}^{\lfloor\frac{a}{d}\rfloor}\sum^{\lfloor\frac{b}{d}\rfloor}_{\beta=1}i(\gcd(\alpha,\beta))

여기서 i(gcd⁡(α,β))i(\gcd(\alpha,\beta))에 뫼비우스 반전공식을 적용하자.

그러면 다음과 같은 식을 만들 수 있다.

∑α=1⌊ad⌋∑β=1⌊bd⌋∑d∣gcd(α,β)μ(d)\sum_{\alpha=1}^{\lfloor\frac{a}{d}\rfloor}\sum^{\lfloor\frac{b}{d}\rfloor}_{\beta=1}\sum_{d|gcd(\alpha,\beta)}\mu(d)

이는 다음과 같이 정리되고, (n=min(⌊ad⌋,⌊bd⌋))(n = min({\lfloor\frac{a}{d}\rfloor, \lfloor\frac{b}{d}\rfloor)})

∑α=1⌊ad⌋∑β=1⌊bd⌋∑k=1n[k∣gcd(α,β)]μ(k)\sum_{\alpha=1}^{\lfloor\frac{a}{d}\rfloor}\sum^{\lfloor\frac{b}{d}\rfloor}_{\beta=1}\sum_{k=1}^{n}[k|gcd(\alpha,\beta)]\mu(k)

이는 다시 아래와 같이 정리할 수 있다.

∑α=1⌊ad⌋∑β=1⌊bd⌋∑k=1n[k∣α][k∣β]μ(k)\sum_{\alpha=1}^{\lfloor\frac{a}{d}\rfloor}\sum^{\lfloor\frac{b}{d}\rfloor}_{\beta=1}\sum_{k=1}^{n}[k|\alpha][k|\beta]\mu(k)

이는 같은 변수끼리 묶었을 때, 아래처럼 쓰여지고,

∑α=1⌊ad⌋[d∣α]∑β=1⌊bd⌋[d∣β]∑k=1nμ(k)\sum_{\alpha=1}^{\lfloor\frac{a}{d}\rfloor}[d|\alpha]\sum^{\lfloor\frac{b}{d}\rfloor}_{\beta=1}[d|\beta]\sum_{k=1}^{n}\mu(k)

최종적으로 우리가 구하고자하는 값은
∑k=1nμ(k)⌊akd⌋⌊bkd⌋\sum_{k=1}^{n}\mu(k) \lfloor\frac{a}{kd}\rfloor\lfloor\frac{b}{kd}\rfloor

로 처음보다 훨씬 계산횟수가 줄어든다.
이제 저 숫자는 뫼비함수의 구간합을 이용해서 빠르게 구할 수 있다.

참고자료 : Codeforce - Möbius inversion formula

profile
집요함과 에너지로 다른 사람에게 영감을 줄 것.

0개의 댓글