CodeForces 546D - Soldier and Number Game(埃氏筛)
题目链接 https://cn.vjudge.net/problem/CodeForces-546D
【题意】
T组数据(T<=1e6)每组数据给定两个数a,b,问a!/b!(a>=b, a,b<=5e6)的素因子个数有多少个?
【思路】
这么多组数据肯定要预处理,设f[x]为x的素因子个数,我们可以利用埃氏筛的思想把f[2]~f[5e6]计算出来,但是题目中还有个阶乘,这里可以发现这样一个规律就是f[x!]=f[(x-1)!]+f[x],所以只需要从前往后,把前面的所有项累加到当前项f[i]上即可
#include<bits/stdc++.h>
using namespace std;
const int maxn=5000050;
bool notprime[maxn];
int f[maxn];
void init(){
for(int i=2;i<maxn;++i){
if(!notprime[i]){
for(int j=i;j<maxn;j+=i){
int cpy=j;
while(cpy%i==0){
++f[j];
cpy/=i;
}
if(j!=i) notprime[j]=true;
}
}
}
for(int i=2;i<maxn;++i) f[i]+=f[i-1];
}
int main(){
init();
int t;
scanf("%d",&t);
while(t--){
int a,b;
scanf("%d%d",&a,&b);
int ans=f[a]-f[b];
printf("%d\n",ans);
}
return 0;
}