P1403 约数研究
与 P3935 Calculating 相似的 P1403 约数研究。
题目描述
科学家们在 Samuel 星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机 Samuel II 的长时间运算成为了可能。由于在去年一年的辛苦工作取得了不错的成绩,小联被允许用 Samuel II 进行数学研究。
小联最近在研究和约数有关的问题,他统计每个正数 \(N\) 的约数的个数,并以 \(f(N)\) 来表示。例如 \(12\) 的约数有 \(1,2,3,4,6,12\),因此 \(f(12)=6\)。下表给出了一些 \(f(N)\) 的取值:
\(N\) | \(1\) | \(2\) | \(3\) | \(4\) | \(5\) | \(6\) |
---|---|---|---|---|---|---|
\(f(N)\) | \(1\) | \(2\) | \(2\) | \(3\) | \(2\) | \(4\) |
现在请你求出:\(\large{\sum_{i=1}^n f(i)}\)
Solution
设 \(f(x)\) 为 \(x\) 的所有因数的个数,由唯一分解定理可知,\(x\) 的因数的个数为
\[f(x) =\sum_{d\mid x}1=\sum_{d=1}^{x}{\left[d\mid x\right]}
\]
所以
\[\sum_{i=1}^{n}f(i)=\sum_{i=1}^{n}\sum_{d\mid i}1=\sum_{i=1}^{n}\sum_{d=1}^{i}{\left[d\mid i\right]}
\]
那么当 \(d>i\) 时,对答案并无影响,所以也可以写成 \(\sum_{i=1}^{n}\sum_{d=1}^{n}{\left[d\mid i\right]}\),在 \(1\) 到 \(n\) 的数中,会被 \(1\) 到 \(n\) 中的数整除的个数。
可以理解为 \(1\) 到 \(n\) 中的数,可以把 \(1\) 到 \(n\) 中的数整除的个数。即,
\[\sum_{d=1}^{n}\sum_{i=1}^{n}{\left[d\mid i\right]}
\]
而对于一个数 \(d\),可以把 \(1\) 到 \(n\) 中的数整除的个数为 \(\left\lfloor\frac{n}{d}\right\rfloor\)。即求出
\[\sum_{d=1}^{n}\left\lfloor\frac{n}{d}\right\rfloor
\]
很明显,可以用 数论分块 来解决。
#include <bits/stdc++.h>
using namespace std;
int n, ans;
int main()
{
scanf("%d",&n);
for (int l = 1, r; l <= n; l = r + 1)
{
r = n/(n/l);
ans += (r-l+1) * (n/l);
}
cout << ans ;
return 0;
}