题目链接:点击这里
题意:给出一个数字,每次用他除以一个因子。问最多可以除几次。
一个数字要能够除最多的数显然每次都除以一个素因子。所以直接一边线性筛找出每一个数的最小质因子,然后像DP一遍统计每素因子数的前缀和就行了。
#include <bits/stdc++.h>
using namespace std;
#define maxn 5000005
bool vis[maxn];
int prime[maxn], cnt;
long long num[maxn], sum[maxn];
int n, a, b;
void init () {
cnt = 0;
memset (vis, 0, sizeof vis);
for (int i = 2; i < maxn; i++) {
if (!vis[i]) {
prime[cnt++] = i;
num[i] = i;
}
for (int j = 0; j < cnt; j++) {
if (1LL*i*prime[j] >= maxn) break;
vis[i*prime[j]] = 1;
num[i*prime[j]] = prime[j];
if (i%prime[j] == 0) {
break;
}
}
}
sum[0] = sum[1] = 0;
for (int i = 2; i < maxn; i++) sum[i] = 1+sum[i/num[i]];
for (int i = 1; i < maxn; i++) sum[i] += sum[i-1];
}
int main () {
init ();
scanf ("%d", &n);
while (n--) {
scanf ("%d%d", &a, &b);
printf ("%lld\n", sum[a]-sum[b]);
}
return 0;
}