题目本质就是:给出a,b,求a的阶乘的因子个数减去b的阶乘的因子个数。
预先打表处理求出范围内的数的因子个数。再求一下前缀和,就得到了对应的数的阶乘的因子个数了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define N 5000001
int prim[N],cnt[N],tot,a[N];//a[i]表示数i最小的质因子
bool v[N];
void init(){
for(int i=2;i<N;++i) a[i]=i;
for(int i=2;i<N;++i){
if(!v[i]) prim[tot++]=i;
for(int j=0;j<tot&&(LL)prim[j]*i<N;++j){
v[i*prim[j]]=1;
if(prim[j]<a[i*prim[j]]) a[i*prim[j]]=prim[j];
if(i%prim[j]==0) break;
}
}
cnt[2]=1;
for(int i=3;i<N;++i) cnt[i]=cnt[i/a[i]]+1;
for(int i=2;i<N;++i) cnt[i]+=cnt[i-1];
}
int main()
{
int n,m,t;
init();
cin>>t;
while(t--){
scanf("%d%d",&n,&m);
printf("%d\n",cnt[n]-cnt[m]);
}
return 0;
}