[BOJ 17372] 피보나치 수의 최대공약수의 합
2022. 6. 16. 21:39ㆍPS/백준
문제는 참 간단하다.
n∑i=1n∑j=1gcd(Fi,Fj)
를 구하면 된다. 그런데 어떻게 빨리 구하냐가 문제인데... 이 식을 변형해보자. gcd(i,j)=d라고 고정하고 각 d에 대해 뭘 계산해야 하는지 알아보자. 변형된 식은 다음과 같다.
n∑d=1FdC(d)
여기서 C(d)는 gcd(i,j)=d인 쌍의 개수를 의미한다. Fd인 이유는 gcd(Fi,Fj)=Fgcd(i,j)이기 때문! 또한 다음을 알 수 있다.
C(d)=2n/d∑i=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 |