题目链接:link
题目大意:
给你一个正整数 N N N,求解 ∑ i = 1 N [ N i ] \sum\limits_{i=1}^N[\frac{N} {i}] i=1∑N[iN]。
解题思路:
根据结论可知 [ N i ] [\frac{N} {i}] [iN] 最多有 2 N 2\sqrt{N} 2N 个不同的值,证明如下:
- 当 1 ≤ i ≤ N 1≤i≤\sqrt{N} 1≤i≤N时,因为 i i i 有 N \sqrt{N} N种,所以 [ N i ] [\frac{N} {i}] [iN]最多也有 N \sqrt{N} N种。
- 当 N ≤ i ≤ N \sqrt{N}≤i≤N N≤i≤N时,因为 [ N i ] [\frac{N} {i}] [iN]是随着i增大而减小的,所以 [ N i ] [\frac{N} {i}] [iN]的范围为: [ 1 , N ) [1,\sqrt{N}) [1,N),所以 [ N i ] [\frac{N} {i}] [iN]最多也是 N \sqrt{N} N种。
- 综上, [ N i ] [\frac{N} {i}] [iN] 最多有 2 N 2\sqrt{N} 2N 个不同的值。
因为是下取整,所以我们不难发现,存在几段连续的
[
N
i
]
[\frac{N} {i}]
[iN]是相等的,并且通过上面可知
[
N
i
]
[\frac{N} {i}]
[iN] 最多有
2
N
2\sqrt{N}
2N 个不同的值,故将每个值
×
×
× 区间长度然后累加起来即为答案,复杂度为O(
N
\sqrt{N}
N)。
求解区间长度:假设区间左端点为
L
L
L(已知),右端点为
R
R
R,通过这个式子
N
L
=
N
R
\frac{N} {L}=\frac{N} {R}
LN=RN 我们可以求出来
R
=
N
/
(
N
/
L
)
R= N/(N/L)
R=N/(N/L)。我们从
L
=
1
L=1
L=1开始枚举,求解完一个区间后,更新
L
=
R
+
1
L=R+1
L=R+1 。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n, ans = 0;
cin >> n;
for (ll l = 1, r; l <= n; l = r + 1)
{
r = n / (n / l);
ans += (r - l + 1) * (n / l);
}
cout << ans << endl;
return 0;
}