怎么说呢...这题和素数筛选的模板不太一样。。我还是太菜了,没办法学以致用55555...
先记录下来以后翻过来再看看吧。。附上AC代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<sstream>
#include<fstream>
#include<utility>
using namespace std;
#define pi acos(-1.0)
#define ll long long
typedef pair<int,int>pp;
const int INF=0x3f3f3f3f;
const ll MOD=1e9+7ll;
const int MAX=5000001;
//const int MAX=30;
int a,b;
bool isprime[MAX];
int num[MAX];
void init()
{
memset(num,0,sizeof(num));
memset(isprime,true,sizeof(isprime));
isprime[1]=false;
for(int i=2; i<MAX; i++)
{
if(isprime[i])
{
//cout<<endl<<"i="<<i<<endl;
for(int j=i;j<MAX;j+=i)
{
//cout<<"j="<<j<<endl;
int temp=j;
while(temp%i==0)//先筛出质因数的个数
{
//cout<<" temp="<<temp<<endl;
num[j]++;
temp/=i;
}
//cout<<" num["<<j<<"]="<<num[j]<<endl;
isprime[j]=false;
}
}
}
for(int i=2; i<MAX; i++)//再加上之前的质数及其质因数
num[i]=num[i]+num[i-1];
/*for(int i=2; i<=20; i++)
cout<<"i="<<i<<" isprime:"<<isprime[i]<<" num="<<num[i]<<endl;*/
}
int main()
{
int t;
scanf("%d",&t);
init();
while(t--)
{
scanf("%d%d",&a,&b);
printf("%d\n",num[a]-num[b]);
}
return 0;
}