题目链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11546
题 意:令f(x)为x的所有约数之和,x的约数即可以被x整除的数,如f(24)=1+2+3+4+6+8+12+24=60),求 f(l) + f(l + 1) + …… + f(r)。
思 路:求出1到200000的所有结果,输出s[r] - s[l-1]即为所求。
注:long long 型 与 __int64 型 及 int 型要注意他们耗时的不同
代码如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
using namespace std;
typedef __int64 LL;
LL a[200003];
int main()
{
int i, j;
int p;
a[0]=0;
a[1]=1;
p=0;
for ( i = 2; i<200002; i++)
{
p=0;
for(j=2; j*j <= i; j++)
{
if( i%j == 0 )
{
p += (j+i/j);
if(j==i/j)
p-=j;
}
}
a[i]=p+a[i-1]+i+1;
}
int T;
scanf ( "%d", &T );
while ( T-- )
{
int r, l;
scanf ( "%d %d", &l, &r );
printf("%I64d\n",a[r]-a[l-1]);
}
return 0;
}