对于一个数,可以玩的轮数就是它质因子的个数。先预处理出来5e6以内所有数的质因子数,因为给出的是a!/b!的形式,两个数乘除就相当于质因子数的加减,所以可以求一下前缀和。
#include<stdio.h>
using namespace std;
struct p{
int k, tot;
} a[5000100];
int f[5000100];
int s[5000100];
int main(){
for(int i = 2; i <= 5000000; i++) a[i].k = i;
for(int i = 2; i <= 5000000; i++){
if(f[i] == 0){
a[i].tot = 1;
for(int j = 2 * i; j <= 5000000; j += i){
f[j] = 1;
while(a[j].k % i == 0 && a[j].k != 0){
a[j].k /= i;
a[j].tot++;
}
}
}
}
for(int i = 1; i <= 5000000; i++){
s[i] = s[i - 1] + a[i].tot;
}
int t;
scanf("%d", &t);
for(int i = 1; i <= t; i++){
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", s[a] - s[b]);
}
return 0;
}