约数个数和
题目链接:ybt 入门到进阶模拟赛 Day1 T2
题目大意
求 l~r 每个数的约数个数的和。
思路
你考虑不要求每个数的约数,而是求这个约数存在于范围内的多少个数中。
那就枚举约数,然后枚举倍数。
(其实不用枚举倍数,直接用除法就可以了,但是枚举倍数也可以过)
代码
#include<cstdio>
#define rr register
#define ll long long
using namespace std;
int l, r;
ll ans;
int main() {
freopen("sum.in", "r", stdin);
freopen("sum.out", "w", stdout);
scanf("%d %d", &l, &r);
for (int i = 1; i <= r; i++) {
int j = i;
while (j < l) {//其实这里完全可以用除法再缩短时间,就是 ans+=(r/i)-(l/i)
j += i;
}
while (j <= r) {
j += i;
ans++;
}
}
printf("%lld", ans);
return 0;
}