求 l~r 的数的约数个数的和。
1
<
=
l
<
=
r
<
=
1
0
7
1<=l<=r<=10^7
1<=l<=r<=107
解
先是前缀和,变成求 1~r 和求 1~l-1 的。
然后就枚举约数,看这个区间有多少数有这个约数,然后加在一起就行了。
代码
#include<cstdio>
int l, r;
long long ans1, ans2;
int main(){
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
scanf("%d%d", &l, &r);
--l;
for(int i = 1; i <= r; ++i){ //枚举约数
ans1 += (l/i); //求1~l-1的数的约数和
ans2 += (r/i); //求1~r的数的约数和
}
printf("%lld", ans2-ans1);
fclose(stdin);
fclose(stdout);
}