题目大意:求(a!/b!)的所有质因数个数的总和
解题思路:
发现是把从1到5000000所有数的质因数全部都求出来,然后求一下前缀和,只要dp[a]-dp[b](dp[i]就是i的质因数的个数)就是答案了。注意这里如果不用前缀和,而是直接这样求和的话也会超时。
#include<bits/stdc++.h>
#define maxn 5000010
using namespace std ;
typedef long long ll;
int n,t,a,b;
int dp[maxn],prime[maxn];
void init(){
memset(prime,0,sizeof(prime));
memset(dp,0,sizeof(dp));
for(int i=2;i<=maxn;i++){
if(prime[i]==0){ //dp[i]为合数
for(int j=i;j<=maxn;j+=i){
int res=j;
while(res%i==0){
dp[j]++;
res/=i;
}
prime[j]=1;
}
}
}
}
int main(){
init(); //素数打表,从1-n打表
for(int i=2;i<=maxn;i++)
dp[i]=dp[i-1]+dp[i]; //计算前缀和
cin>>t;
while(t--){
scanf("%d%d",&a,&b);
printf("%d\n",dp[a]-dp[b]);
}
return 0;
}