对于给定的数只要保证每次除的是它的质因子就可以使除的次数最多。问题就转化为求b+1到a中所有数的质因子总和。
求所有数的质因数数量,可以在筛法求素数对于因子i枚举i的倍数j时,对j一直除i直到不能整除,除了几次就说明j中有几个质因子i,把这些统计起来,具体看代码。
因为询问很多,要做一个前缀和的结构。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#include <set>
#include <cmath>
#define LL long long
#define maxn 5000005
#define maxp 1000005
int vis[maxn];
int prime[maxp];
LL res[maxn];
LL k[maxn];
void sieve(int n){
int m=sqrt(n+0.5);
memset(vis,0,sizeof(vis));
for(int i=2;i<=n;i++){
if(!vis[i]){
for(int j=i;j<=n;j+=i){
int cur=j;
while(cur%i==0){
cur/=i;
res[j]++;
}
vis[j]=1;
}
}
}
}
int main(){
sieve(5000000);
for(int i=2;i<=5000000;i++){
k[i]=k[i-1]+res[i];
}
int t;
scanf("%d",&t);
while(t--){
int a,b;
scanf("%d%d",&a,&b);
printf("%I64d\n",k[a]-k[b]);
}
return 0;
}