DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

Easy Divisor Problem

문제로 돌아가기

해설

D(N)D(N)D(N)을 다음과 같이 쓰자.

D(N)=∑x=1Nτ(x).D(N)=\sum_{x=1}^{N}\tau(x).D(N)=x=1∑N​τ(x).

τ(x)\tau(x)τ(x)는 ab=xab=xab=x를 만족하는 양의 정수 순서쌍 (a,b)(a,b)(a,b)의 개수이다. 따라서

D(N)=#{(a,b)∈Z>02:ab≤N}=∑a=1N⌊Na⌋.D(N)=\#\{(a,b)\in\mathbb Z_{>0}^2:ab\le N\} =\sum_{a=1}^{N}\left\lfloor\frac Na\right\rfloor.D(N)=#{(a,b)∈Z>0

즉, 문제는 쌍곡선 xy=Nxy=Nxy=N 아래의 양의 정수 격자점 수를 세는 문제이다.

서브태스크 1

N≤106N\le10^6N≤106이면 위 합을 그대로 계산할 수 있다. 시간 복잡도는 O(N)O(N)O(N)이다.

서브태스크 2

쌍곡선은 x=yx=yx=y에 대해 대칭이다. X=⌊N⌋X=\lfloor\sqrt N\rfloorX=⌊N​⌋라 하면

D(N)=2∑x=1X⌊Nx⌋−X2.D(N)=2\sum_{x=1}^{X}\left\lfloor\frac Nx\right\rfloor-X^2.D(N)=2x=1∑X​⌊

따라서 O(N)O(\sqrt N)O(N​)에 계산할 수 있고, N≤1012N\le10^{12}N≤10에서는 충분하다.

전체 서브태스크

N≤1018N\le10^{18}N≤1018에서는 O(N)O(\sqrt N)O(N도 충분하지 않다. 정해는 Richard Sladkey의 successive approximation 방법을 사용하여 격자점 수를 시간, 추가 공간에 계산한다.

먼저

Xmax⁡=⌊N⌋,Ymin⁡=⌊NXmax⁡⌋X_{\max}=\lfloor\sqrt N\rfloor,\qquad Y_{\min}=\left\lfloor\frac{N}{X_{\max}}\right\rfloorXmax​=⌊N

를 두고, 구현에서는

Xmin⁡=min⁡(Xmax⁡, 2⌈2N3⌉)X_{\min}=\min\left(X_{\max},\ 2\left\lceil\sqrt[3]{2N}\right\rceil\right)Xmin​=min(Xmax​

로 둔다. x<Xmin⁡x<X_{\min}x<Xmin​인 열은 직접 합산한다. 이 부분은 O(N1/3)O(N^{1/3})O(N1/3)이다.

나머지 부분에서는 쌍곡선에 가까운 정수 직선들을 이용해 영역을 나눈다. 두 경계 직선을

L1:a1x+b1y=c1,L2:a2x+b2y=c2L_1:a_1x+b_1y=c_1,\qquad L_2:a_2x+b_2y=c_2L1​:a1​x+b

라 하자. 기울기들이 Farey neighbor가 되도록 잡아

a1b2−a2b1=1a_1b_2-a_2b_1=1a1​b2​−a2​b

을 만족시킨다.

새 좌표를

u=a1x+b1y−c1,v=a2x+b2y−c2u=a_1x+b_1y-c_1,\qquad v=a_2x+b_2y-c_2u=a1​x+b1​y−

로 정의하면 행렬식이 111이므로 정수 격자점이 일대일 대응한다. 역변환은

x=b2(u+c1)−b1(v+c2),x=b_2(u+c_1)-b_1(v+c_2),x=b2​(u+c1​)− y=a1(v+c2)−a2(u+c1)y=a_1(v+c_2)-a_2(u+c_1)y=a1​(v+c2​)−

이다.

이 좌표에서 쌍곡선 위의 vvv를 uuu의 함수로 풀면

V(u)=(a1b2+b1a2)(u+c1)−(u+c1)2−4a1b1N2a1b1−c2.V(u)=\frac{(a_1b_2+b_1a_2)(u+c_1)-\sqrt{(u+c_1)^2-4a_1b_1N}}{2a_1b_1}-c_2.V(u)=2a

마찬가지로

U(v)=(a1b2+b1a2)(v+c2)−(v+c2)2−4a2b2N2a2b2−c1.U(v)=\frac{(a_1b_2+b_1a_2)(v+c_2)-\sqrt{(v+c_2)^2-4a_2b_2N}}{2a_2b_2}-c_1.U(v)=2a

영역의 너비나 높이가 작은 경우에는 ⌊V(u)⌋\lfloor V(u)\rfloor⌊V(u)⌋ 또는 ⌊U(v)⌋\lfloor U(v)\rfloor⌊U(v)⌋를 직접 더한다.

그렇지 않으면 mediant

a3=a1+a2,b3=b1+b2a_3=a_1+a_2,\qquad b_3=b_1+b_2a3​=a1​+a

를 사용한다. 새 좌표에서 기울기가 −1-1−1인 접점의 uuu좌표는

utan=(a1b2+b1a2+2a1b1)Na3b3−c1u_{\mathrm{tan}}=(a_1b_2+b_1a_2+2a_1b_1)\sqrt{\frac{N}{a_3b_3}}-c_1utan​=(a1​

이다. u4=⌊utan⌋u_4=\lfloor u_{\mathrm{tan}}\rflooru4​=⌊utan​⌋, u5=u4+1u_5=u_4+1u로 두고

v4=⌊V(u4)⌋,v5=⌊V(u5)⌋,v_4=\lfloor V(u_4)\rfloor,\qquad v_5=\lfloor V(u_5)\rfloor,v4​=⌊V(u4​)⌋,v v6=u4+v4,u7=u5+v5v_6=u_4+v_4,\qquad u_7=u_5+v_5v6​=u4​+v

를 계산한다.

Δ(k)=k(k+1)/2\Delta(k)=k(k+1)/2Δ(k)=k(k+1)/2라 하면 가운데 다각형의 격자점 수는 구현에서

Δ(v6−1)−Δ(v6−u5)+Δ(u7−u5)\Delta(v_6-1)-\Delta(v_6-u_5)+\Delta(u_7-u_5)Δ(v6​−1)−Δ(v6​

로 계산할 수 있다. 남은 두 영역은 각각 (a1/b1,a3/b3)(a_1/b_1,a_3/b_3)(a1​/b1​,a3​/b와 를 경계로 하므로 같은 함수를 재귀 호출한다.

최상위에서는 기울기 −1,−2,−3,…-1,-2,-3,\ldots−1,−2,−3,…에 해당하는 영역을 차례로 처리한다. 기울기 −a-a−a 부근의 접점은 x≈N/ax\approx\sqrt{N/a}x≈N/a이므로, 이 되면 중단하고 남은 짧은 부분을 직접 계산한다. 각 단계의 삼각형 부분은 삼각수로 즉시 더할 수 있다.

이 방법이 방문하는 전체 영역 수는 O(N1/3)O(N^{1/3})O(N1/3)이고 재귀 깊이는 O(log⁡N)O(\log N)O(logN)이다. 따라서 전체 시간 복잡도는 O(N1/3)O(N^{1/3})O(N, 추가 공간 복잡도는 이다.

N=1018N=10^{18}N=1018이면 D(N)D(N)D(N) 자체는 signed 64-bit 범위를 넘을 수 있다. 정답을 정확히 세는 중간 합에는 __int128을 사용하고, 마지막에만 998 244 353998\,244\,353998244353으로 나눈다. 쌍곡선과 제곱근 판정에 필요한 곱셈도 __int128으로 계산한다.

Solution written by GPT5.6

2
​
:
ab≤
N}=
a=1∑N​⌊aN​⌋.
x
N
​
⌋
−
X2.
12
​
)
O(N1/3)O(N^{1/3})O(N1/3)
O(log⁡N)O(\log N)O(logN)
​
⌋
,
Ymin​
=
⌊Xmax​N​⌋
,
 
2
⌈32N​⌉
)
1​
y
=
c1​,L2​:
a2​x+
b2​y=
c2​
1
​
=
1
c1​,v=
a2​x+
b2​y−
c2​
b1​
(
v
+
c2​),
a2​
(
u
+
c1​)
1
​
b1​
(a1​b2​+b1​a2​)(u+c1​)−(u+c1​)2−4a1​b1​N
​
−
c2​.
2
​
b2​
(a1​b2​+b1​a2​)(v+c2​)−(v+c2​)2−4a2​b2​N
​
−
c1​.
2
​
,
b3​
=
b1​+
b2​
b
2​
+
b1​a2​+
2a1​b1​)a3​b3​N​​−
c1​
5​
=
u4​+
1
5​
=
⌊V(u5​)⌋,
4
​
,
u7​
=
u5​+
v5​
−
u5​)+
Δ(u7​−
u5​)
3
​
)
(a3/b3,a2/b2)(a_3/b_3,a_2/b_2)(a3​/b3​,a2​/b2​)
​
x<Xmin⁡x<X_{\min}x<Xmin​
1/3
)
O(log⁡N)O(\log N)O(logN)
​
​