题目描述
n是两个连续的奇素数的平均值,且n不是素数,那么我们称这样的数是"内部素数"。求区间[a,b]内"内部素数"的个数。比如,前5个"内部素数"是4,6,9,12,15。
输入
第一行是样例数T(1≤T≤1000)。 每个样例一行,为三个整数a,b(1≤a≤b≤106)。
输出
每行输出一个样例的结果。
样例输入
5 1 10 1 100 1 1000 1 10000 1 100000样例输出
3 24 166 1228 9591
解题思路:本题最大的毒点就是,你如果就把最大数定为1e6,那么你将永远找不到错在哪,因为忘记考虑 一个小于1e6的数 + 一个大于1e6的数 除以 2,还是可能 小于 1e6 的。
AC代码:
- #include
-
- const int MAXN = 1e6+500;
- bool vis[MAXN]; // 筛选MAXN个素数
- int prime[80000]; // 把素数依次存放在该数组中
- int abQuJian[MAXN];
-
- void isPrime()
- {
- for (int i = 2; i < MAXN; i ++)
- {
- if ( !vis[i])
- prime[++prime[0]] = i; // prime[0] --> 筛选出的素数个数
- for (int j = 1; j <= prime[0] && i <= MAXN/prime[j]; j ++)
- {
- vis[i*prime[j]] = 1;
- if (i % prime[j] == 0)
- break;
- }
- }
- }
-
- void solve()
- {
- for (int i = 2; i < prime[0]; i ++)
- {
- int n = (prime[i]+prime[i+1])/2;
- abQuJian[n] = 1;
- }
- for (int i = 2; i <= MAXN; i ++)
- abQuJian[i] += abQuJian[i-1];
- }
-
- int main()
- {
- isPrime(); // 欧拉筛
- solve(); // 前缀和
- int T,a,b;
- scanf("%d",&T);
- while ( T --)
- {
- scanf("%d %d",&a,&b);
- printf("%d\n",abQuJian[b]-abQuJian[a-1]);
- }
- }