Description–
定义f(x)为x的约数个数,x为正整数。
=f(a)+f(a+1)+……+f(b)
- 即a,b之间每个数的约数的总和。
Input–
一行两个正整数a、b,以一个空格隔开
Output–
一行一个整数,即答案
Sample Input–
2 6
Sample Output–
13
说明–
数据范围
对于50%的数据,1≤a≤b≤1000;
对于100%的数据,1≤a≤b≤10,000,000。
解题思路&代码–
50分的做法(超时)
- 纯模拟
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a,b,ans;
int hhh(int x)
{
int s=0;
for (int i=1;i<=sqrt(x);++i)
{
if (x%i==0)
if (i==sqrt(x))
s++;
else s+=2;
}
return s;
}
int main()
{
scanf("%d%d",&a,&b);
for (int i=a;i<=b;++i)
ans+=hhh(i);
printf("%d",ans);
return 0;
}
100分的做法
- 一次性判断a~b之间的所有数是否含有约数i
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a,b,ans,t,s;
int main()
{
scanf("%d%d",&a,&b);
for (int i=1;i<=b;++i)
{
t=a;
if (t%i!=0) t=t+(i-t%i);
s=((b-t)/i)+1;
if (t<=b) ans+=s;
}
printf("%d",ans);
return 0;
}