Loading [MathJax]/jax/output/CommonHTML/jax.js

[BOJ 17372] 피보나치 수의 최대공약수의 합

2022. 6. 16. 21:39PS/백준

문제는 참 간단하다.

ni=1nj=1gcd(Fi,Fj)

를 구하면 된다. 그런데 어떻게 빨리 구하냐가 문제인데... 이 식을 변형해보자. gcd(i,j)=d라고 고정하고 각 d에 대해 뭘 계산해야 하는지 알아보자. 변형된 식은 다음과 같다.

nd=1FdC(d)

여기서 C(d)gcd(i,j)=d인 쌍의 개수를 의미한다. Fd인 이유는 gcd(Fi,Fj)=Fgcd(i,j)이기 때문! 또한 다음을 알 수 있다.

C(d)=2n/di=1ϕ(i)1

이는 d=1일 경우를 생각해보면 편하다. d=1일 때 i를 고정하고 j의 개수를 세자. 이때 (1,1)=1인 경우가 2번 세지니까 1을 뺀 것이다. 이렇게 유도된 C(1)을 바탕으로 C(d)를 유도해낼 수 있다. 이때 C(d)N/d항을 포함하니까 시간복잡도는 O(N)이 될 것이다. 우리가 해결해야할 문제는 어떻게 오일러 파이 함수의 합을 빨리 계산하냐는 것이다. 그것은 xudyh's sieve를 사용하면 된다. 이것은 여기 에 자세히 설명되어있다. 나머지는 피보나치 수의 성질을 이용한다면 쉽게 계산할 수 있다.

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

[BOJ 16141] 정수론과 응용: 레시테이션  (2) 2022.06.16
[BOJ 16644] Easy Problem  (9) 2022.06.16
[BOJ 18151] DivModulo  (0) 2022.05.16
[BOJ 13174] 괄호  (0) 2022.05.10
[BOJ 7938] Mniam mniam  (0) 2022.05.10