题目链接
思路 && 代码
数论分块
算是数论分块的模板题了吧
20分做法
纯暴力,直接枚举,然后每个数 O ( n ) O(\sqrt{n}) O(n) 判断,时间复杂度 O ( n n ) O(n \sqrt{n}) O(nn)
需要注意不要闷着头一直枚举到 n \sqrt{n} n,如果 n n n的约数 i i i的平方恰好等于 n n n,只加一个就足够了
int x, y, ans;
signed main() {
x = read(), y = read();
for (int i = x; i <= y; i++) {
for (int j = 1; j <= sqrt(i); j++) {
if (!(i % j)) {
if (j * j == i) ans += j;
else ans += j + (i / j);
}
}
}
cout << ans << '\n';
return 0;
}
60分做法
也是一种暴力 思路是转枚举约数为枚举倍数
容易得出一个数 i i i 在 n n n中一共有 ⌊ n i ⌋ \lfloor\frac{n}{i}\rfloor ⌊in⌋ 个 i i i的倍数,那么 i i i在 n n n中的贡献为 ⌊ n i ⌋ ∗ i \lfloor\frac{n}{i}\rfloor * i ⌊