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;
}
posted @ 2023-01-12 17:46  Ciaxin  阅读(20)  评论(0编辑  收藏  举报