知识点:质数
这个题还是比较简单的,题目说的数,是合数但是只有一个质因子,显然是质数的大于1次方的数,那么显然我们预处理1e6范围以内的质数就行了,然后每个质数,找他的大于1次方,并且在题目范围里面的数的个数就行了,这里还是可以用二分的,但是又没用,累了
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int h[N], a[N], m;
void solve() {
for (int i = 2; i <= 1e6; i++) {
if (!h[i]) {
a[++m] = i;
for (int j = i + i; j <= 1e6; j += i) h[j] = 1;
}
}
}
int main() {
solve();
int T;
scanf("%d", &T);
while (T--) {
long long l, r;
cin >> l >> r;
int ans = 0;
for (int i = 1; i <= m; i++) {
for (long long j = (long long) a[i] * a[i]; j <= r; j *= a[i]) {
if (j >= l) ans++;
}
}
printf("%d\n", ans);
}
return 0;
}