素数筛预处理一下就好了。
#include<bits/stdc++.h>
using namespace std;
void read(int&a){
char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
}
inline void prin_d(long long x)
{
if (x > 9)
{
prin_d(x / 10);
}
putchar(x % 10 + '0');
return ;
}
const long long MAXN=5000500;
long long facsum[MAXN],sum[MAXN];
int main()
{
int T,a,b,i,j;
memset(facsum,0,sizeof(facsum));
sum[0]=sum[1]=0;
for(i=2;i<MAXN;i++)
{
if(!facsum[i])
{
for(j=i;j<MAXN;j+=i)
{
facsum[j]=facsum[j/i]+1;
}
}
sum[i]=sum[i-1]+facsum[i];
}
read(T);
while(T--)
{
read(a);
read(b);
prin_d(sum[a]-sum[b]);
puts("");
}
}