PS 일지 (2022.06.30)

Bard·2022년 6월 30일
3

PS 일지

목록 보기
9/11
post-thumbnail

17372. 피보나치 수의 최대공약수의 합

Diamond 2

문제 분석

피보나치 수는 다음과 같은 규칙으로 만들어지는 수열이다.

F1=1F2=1Fn+2=Fn+Fn+1F_1 = 1\\ F_2 = 1\\ F_{n+2} = F_{n} + F_{n+1}

처음 몇 개의 항은 다음과 같다.

1,1,2,3,5,8,13,...1, 1, 2, 3, 5, 8, 13, ...

이때 다음 합을 구하는 문제이다.

i=1nj=1ngcd(Fi,Fj)\displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^n \gcd(F_i, F_j)

이때 gcd\gcd는 두 수의 최대공약수를 의미한다.

nn10910^9 까지 커질 수 있으므로 무조건 O(n)O(n) 미만으로 깎아야 한다.

풀이

피보나치 수의 성질

우선 피보나치수의 성질을 이용해서 다음과 같이 정리하자.

i=1nj=1ngcd(Fi,Fj)=i=1nj=1nFgcd(i,j)\displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^n \gcd(F_i, F_j) = \displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^n F_{\gcd(i, j)}

해당 성질의 증명은 GCD of Fibonacci Numbers에 있다.

아직도 시간 내에 풀기에는 불가능하므로 \sum을 하나 떼어내 보자.

이를 위해 gcd(i,j)=d\gcd(i, j) = d를 만족하는 (i,j)(i, j)의 개수를 세서 같은 dd를 가진 피보나치 수끼리 묶어보자.

위 개수를 cntn(d)cnt_n(d) 라고 하면 아래와 같이 식이 정리된다.

d=1ncntn(d)Fd\displaystyle\sum_{d=1}^n cnt_n(d)F_d

cnt(d)에 대한 고찰

물론 일일히 모든 (i,j)(i, j) 쌍을 검사할 수도 있지만, 그러면 시그마를 떼어낸 의미가 없다.

따라서 다음과 같이 cntcnt를 수정하자.

cntn(d)=cntn/d(1)cnt_n(d) = cnt_{\lfloor n/d \rfloor}(1)

그리고 cntn(1)=S(n)cnt_n(1) = S(n) 이라고 표현하자. 그러면 식은 여기까지 정리된다.

d=1ncntn(d)Fd=d=1nS(n/d)Fd\displaystyle\sum_{d=1}^n cnt_n(d)F_d = \displaystyle\sum_{d=1}^n S(\lfloor n/d \rfloor)F_d

S(n)S(n) 은 어떻게 구할 수 있을까?

우선 S(n)S(n)n×nn \times n 격자에서 좌표가 서로소인 점들의 개수이다.

따라서 격자의 개수 n2n^2에서 gcd(i,j)=2,...n\gcd(i, j) = 2, ... n 을 하나씩 빼주면 된다.

완성된 식은 다음과 같다.

S(n)=n2d=2nS(n/d)S(n) = n^2 - \displaystyle\sum_{d=2}^n S(\lfloor n/d \rfloor)

S(N) 개선

하지만 이것도 너무 느리다. 좀 더 개선해보자.

n/d\lfloor n/d \rfloor를 잘 보면 ddnn에 가까워질 수록 변화가 거의 없다는 것을 알 수 있다.

42/22=42/23==42/42=1\lfloor 42/22 \rfloor = \lfloor 42/23 \rfloor = \cdots = \lfloor 42/42 \rfloor = 1

여기에서 착안해서 함수를 두 부분으로 나눌 수 있다.

S(n)=n2d=2nS(n/d)k=1n1(n/kn/(k+1))S(k)S(n) = n^2 - \displaystyle\sum_{d=2}^{\lfloor\sqrt{n}\rfloor} S(\lfloor n/d \rfloor) - \displaystyle\sum_{k=1}^{\lceil\sqrt{n}-1\rceil} (\lfloor n/k \rfloor - \lfloor n/(k+1) \rfloor)S(k)

이러한 트릭은 xudyh's sieve 또는 Mertens Trick 이라고 불리고, 전처리 과정을 포함한다면 O(n2/3)O(n^{2/3}) 으로 계산할 수 있다고 알려져있다.

다시 돌아와서

i=1nj=1ngcd(Fi,Fj)=d=1nS(n/d)Fd\displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^n \gcd(F_i, F_j) = \displaystyle\sum_{d=1}^n S(\lfloor n/d \rfloor)F_d

S(n)S(n)을 개선할 때 사용한 아이디어를 다시 활용해보면 다음과 같이 정리할 수 있다.

d=1nS(n/d)Fd+k=1n1(i=nk+1nk1Fi)S(k)\displaystyle\sum_{d=1}^{\lfloor\sqrt{n}\rfloor} S(\lfloor n/d \rfloor)F_d + \displaystyle\sum_{k=1}^{\lceil\sqrt{n}-1\rceil} (\displaystyle\sum_{i={\lfloor {n \over k+1} \rfloor}}^{\lfloor {n \over k} \rfloor - 1}F_i)S(k)

풀고 있는 문제 리스트(Diamond II)

  • 정수론 (1/23)
profile
The Wandering Caretaker

0개의 댓글