Möbius inversion formula (BOJ 1792)

Bard·2020년 12월 4일
1

Algorithm

목록 보기
2/5
post-thumbnail

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

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

  1. 수론적 함수
    모든 양의 정수에서 값이 정의되는 함수로, 복소수의 수열이라고 볼 수 있다.
  2. 뫼비우스 함수
    nnkk개의 소인수를 갖는 제곱 인수가 없는 정수라면 μ(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)의 개수를 구하는 프로그램을 작성하시오.

  • 1xa1 ≤ x ≤ a
  • 1yb1 ≤ y ≤ b
  • xxyy의 최대공약수는 dd이다.

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

i=1aj=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라고 하자. 이 때, 위 식은 아래와 같이 쓸 수 있다.

α=1adβ=1bdi(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))에 뫼비우스 반전공식을 적용하자.

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

α=1adβ=1bddgcd(α,β)μ(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)})

α=1adβ=1bdk=1n[kgcd(α,β)]μ(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)

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

α=1adβ=1bdk=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)

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

α=1ad[dα]β=1bd[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)akdbkd\sum_{k=1}^{n}\mu(k) \lfloor\frac{a}{kd}\rfloor\lfloor\frac{b}{kd}\rfloor

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

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

profile
The Wandering Caretaker

0개의 댓글