#include<stdio.h>
#include<string.h>
#include<math.h>
int a[1000010];
#define MAXN 1000010
unsigned int plist[60000],pcount;
unsigned int isprime[(MAXN>>5)+1];
#define setbitzero(a) (isprime[(a)>>5]&=(~(1<<((a)&31))))
#define setbitone(a) (isprime[(a)>>5]|=(1<<((a)&31)))
#define ISPRIME(a) (isprime[(a)>>5]&(1<<((a)&31)))
void initprime(){
int i,j,m;
int t=(MAXN>>5)+1;
for(i=0;i<t;++i)isprime[i]=2863311530;
plist[0]=2;setbitone(2);setbitzero(1);
m=(int)sqrt(MAXN);
for(pcount=1,i=3;i<=m;i+=2)
if(ISPRIME(i))
for(plist[pcount++]=i,j=i<<1;j<=MAXN;j+=i)
setbitzero(j);
if(!(i&1))++i;
for(;i<=MAXN;i+=2)
if(ISPRIME(i))
{
plist[pcount++]=i;
a[i]=i;
}
}
int main()
{
int t,i,j,temp;
scanf("%d",&t);
memset(a,0,sizeof(a));
initprime();
for(i=2;i<=1000010;i++)
{
if(a[i]==0)
{
temp=i;
for(j=2;j<=temp;j++)
{
if(temp%j==0)
{
a[temp]=a[temp/j]+j;
temp=temp/j;
break;
}
}
}
}
while(t--)
{
int l,r;
long long sum=0;
scanf("%d%d",&l,&r);
for(i=l;i<=r;i++)
sum+=a[i];
printf("%lld\n",sum);
}
return 0;
}
xmu 1307一把心酸一把泪啊
最新推荐文章于 2020-08-19 22:01:15 发布