xtu oj 1131
提示:筛法
首先看到求 ( a , b ) (a,b) (a,b) 的答案,就可以想到是前缀和。
那么我们就需要预先处理出所有的答案。
这个其实就是在朴素埃筛的上面变形了一下,我们换个角度看问题,考虑每个素因子对每个数的贡献,那么在筛的过程中顺便处理一下每个素因子的贡献就好了,由于每个素数只遍历了一遍,那么就可以保证不重不漏。
#include <stdio.h>
typedef long long ll;
#define N 1001002
int np[N];
ll sum[N];
void init() {
for (int i = 2; i < N; ++i)
{
if (!np[i])
{
for (int j = i; j < N; j += i)
{
np[j] = 1; // 朴素埃筛
int x = j, num = 0;
while (x % i == 0) x /= i, num ++; // 处理因子的幂
sum[j] += num;
}
}
}
for (int i = 1; i < N; ++i) // 前缀和
sum[i] += sum[i - 1];
}
int main()
{
init();
int T, a, b;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &a, &b);
printf("%lld\n", sum[b] - sum[a - 1]);
}
return 0;
}