CSU1030 素数槽

 处于相邻的两个素数pp + n之间的n - 1个连续的合数所组成的序列我们将其称为长度为n的素数槽。例如,‹24, 25, 26, 27, 28›是处于素数23和素数29之间的一个长度为6的素数槽。

       你的任务就是写一个程序来计算包含整数k的素数槽的长度。如果k本身就是素数,那么认为包含k的素数槽的长度为0。

Input

第一行是一个数字n,表示需要测试的数据的个数。后面有n行,每行是一个正整数k, k大于1并且小于或等于的第十万个素数(也就是1299709)。

Output

对于输入部分输入的每一个k,都对应输出一个非负整数,表示包含k的素数槽的长度,每个非负整数占一行。

Sample Input

5
10
11
27
2
492170

Sample Output

4
0
6
0
114

筛一发素数,然后二分一下范围就行。。。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cctype>

using namespace std;

const int N = 2000000;

int prime[N], p, vis[N], n, k;

int main() {
    vis[1] = 1;
    for(int i = 2 ; i < N ; i ++) {
        if(!vis[i]) prime[p ++] = i;
        for(int j = 0 ; j < p ; j ++) {
            if(i * prime[j] >= N) break;
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0) break;
        }
    }
    scanf("%d", &n);
    for(int i = 1 ; i <= n ; i ++) {
        scanf("%d", &k);
        if(*lower_bound(prime, prime + p, k) == k) puts("0");
        else {
            int r = *lower_bound(prime, prime + p, k);
            if(prime[0] > k) {
                printf("%d\n", r);
            } else {
                int l = *(lower_bound(prime, prime + p, k) - 1);
                printf("%d\n", r - l);
            }
        }
    }
}

  


posted @ 2017-09-08 19:21  KingSann  阅读(178)  评论(0)    收藏  举报