XTU OJ 1339 Interprime

XTU OJ 1339 Interprime

题目描述

n是两个连续的奇素数的平均值,且n不是素数,那么我们称这样的数是"内部素数"。求区间[a,b]内"内部素数"的个数。比如,前5个"内部素数"是4,6,9,12,15。

输入

第一行是样例数T(1 ≤ T ≤ 1000)。 每个样例一行,为三个整数a,b( 1 1 1 ≤ a ≤ b ≤ 1 0 6 10^6 106)。

输出

每行输出一个样例的结果。

样例输入

5
1 10
1 100
1 1000
1 10000
1 100000

样例输出

3
24
166
1228
9591

题解

偷懒写在注释里面啦

#include 
#include  
#define MAXLEN 1001000//虽然题目要求b<=1000000,但千万不要被它骗了,内部素数小于1000000,但用来求它的两个连续素数不一定小于1000000!
int prime[80000];
int inter[MAXLEN + 1] = { 0 };
int check[MAXLEN + 1];

int main() {
    int T;
    int i, j, t;
    int ordNum = 1;
    memset(prime, 0, sizeof(prime));
    memset(inter, 0, sizeof(inter));
    memset(check, 0, sizeof(check));
    for (i = 2; i <= MAXLEN; i++) {//欧拉筛打素数表
        if (!check[i])prime[ordNum++] = i;
        for (j = 1; j < ordNum; j++) {
            if (i * prime[j] > MAXLEN)break;
            check[i * prime[j]] = 1;
            if (i % prime[j] == 0)continue;
        }
    }
    for (i = 3; prime[i] != 0; i++) {//标记内部素数
        t = prime[i] + prime[i - 1];
        if (t % 2 == 0)inter[t / 2] = 1;
    }
    for (i = 3; i <= MAXLEN; i++) {//前缀和
        inter[i] += inter[i - 1];
    }
    scanf_s("%d", &T);
    while (T--) {
    int a, b;
    scanf_s("%d %d", &a, &b);
    printf("%d\n", inter[b] - inter[a - 1]);//区间相减
    }
    return 0;
}

你可能感兴趣的:(XTU/Luogu,OJ,1024程序员节,c语言)