2022. 6. 16. 23:35ㆍPS/백준
아주 교육적인 문제 xudyh's sieve를 잘 활용할 수 있냐를 묻고 있다.(아마 그럴거다)
xudyh's sieve를 유도하면서 어떻게 식을 변형할지 알아보자. 앞으로 어떤 함수의 1부터 N까지 부분합을 Sf(N)이라 적겠다. 위 테그닉은 Sf∗g(N)과 Sg(N)을 쉽게 계산할 수 있을 때 Sf(N)을 쉽게 계산하는 방법에 대해 말해준다. 다음 식과 함께 시작하자.
Sf∗g(N)=N∑d=1g(d)Sf(⌊Nd⌋)
이때 적절한 변형을 통해 다음을 얻는다.
Sf(N)=1g(1)(Sf∗g(N)−N∑d=2g(d)Sf(⌊Nd⌋))
자 이제 본 문제의 주어진 식을 변형해보자.
n∑i=1v∑u=1ϕ(i,u)
이때 ϕ(n,k)는 Jordan totient function이라고도 불리는데 다음을 만족한다.
ϕ(n,k)=∑d|nμ(d)⌊Nd⌋k
다음을 정의하자.
H(n,k)=k∑i=1ni
구한 식들을 이용해 준식을 변형해보자.
n∑i=1∑d|iμ(d)H(⌊id⌋,v)
이때 이렇게 쓰면 어떨까?
f(i)=∑d|iμ(d)H(⌊id⌋,v)
sf(n)=n∑i=1f(i)
짜잔, 우리가 구하려는 식은 f의 부분합이 되어버렸다. 우린 f=μ∗H라는 것을 알 수 있고 이로써 u∗f=H를 얻는다.(u∗μ=I) 앞서 유도한 xudyh's sieve에 대입해보자.
Sf(n)=SH(n)−n∑d=2dSf(⌊nd⌋))
세상에... 이것보다 간단할 수 있을까? 이제 최적화를 해보자. SH(n)을 빨리 구할 방도를 마련해보자.
SH(n)=n∑i=1v∑j=1ij=v∑j=1n∑i=1ij
이렇게 변형하면 dp를 이용해서 우변을 빠르게 계산할 수 있다. 마치 1492번처럼!
이로써 이번 글을 마치겠다. 끝!
'PS > 백준' 카테고리의 다른 글
[BOJ 15868] Yule Lads (0) | 2022.06.17 |
---|---|
[BOJ 13729] 1013 피보나치 (0) | 2022.06.16 |
[BOJ 16644] Easy Problem (9) | 2022.06.16 |
[BOJ 17372] 피보나치 수의 최대공약수의 합 (0) | 2022.06.16 |
[BOJ 18151] DivModulo (0) | 2022.05.16 |