洛谷 P1403 约数研究
洛谷 P1403 约数研究
原题链接:P1403 约数研究 - 洛谷
数据增强:U264257 Multiple (Difficult) - 洛谷
前置知识
-
\(a\) 能整除 \(b\) (或者说\(b\)是\(a\)的因子)用符号表示为 \(b\mid a\)
-
\(1\sim n\) 中约数(即因子)含 \(x\) 的数的个数为 \(\left\lfloor\dfrac{n}{x}\right\rfloor\)
证明
对于 \(x\) 作为因子,\(x\) 一定为 \(x,2x,3x,4x,...,kx\) 的因子,则 \(k=\left\lfloor\dfrac{n}{x}\right\rfloor\)
所以 \(answer=k=\left\lfloor\dfrac{n}{x}\right\rfloor\)
解决该题
以 \(n=6\) 为例,即求 \(\sum_{i=1}^6f(i)\)
1 的约数:1
2 的约数:1,2
3 的约数:1, ,3
4 的约数:1,2, ,4
5 的约数:1, , , ,5
6 的约数:1,2,3, , ,6
正常思路:求每个数的约数个数,再求和,即横着看
换种思路:求 \(1\sim n\) 中有多少个数约数含 \(i\) ,其中 \(i\in [1,n]\),即竖着看
证明:
\[由题得,要求的值为\sum_{i=1}^{n}f(i)=\sum_{i=1}^{n}\sum_{d\mid i}1 \]\[即\sum_{i=1}^{n}f(i)=\sum_{i=1}^{n}\sum_{d=1}^{n}{(d\mid i)} \]\[交换求和顺序\sum_{i=1}^{n}f(i)=\sum_{d=1}^{n}\sum_{i=1}^{n}{(d\mid i)} \]\[由前置知识2得 \sum_{i=1}^{n}f(i)=\sum_{d=1}^{n}\left\lfloor\dfrac{n}{d}\right\rfloor \]
Code(50)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int ans = 0;
for (int i = 1; i <= n; ++i) {
ans += n / i;
}
System.out.println(ans);
}
}
Code(100)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long ans = 0;
for (long l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
ans += n / l * (r - l + 1);
}
System.out.println(ans);
}
}