DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类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)
​
​