Hdu 3823 Prime Friend

来源:互联网 发布:mac finder 路径 编辑:程序博客网 时间:2024/05/16 01:28

素数筛选 特判



题意:给出两个数字a,b。使a+x, b+x都是素数,并且它们之间没有素数。求出这样的最小的x。

分析:由于无论a,b与什么数相加之间的差值都相等,所以实际上求的是大于b的与其前一个数的差值是a-b的素数。所以该题的关键是将20000000之前的素数打表,然后求其每个之间的差值,相等的存放到同一个数组中。



AC代码:

#include<iostream>#include<vector>#include<stdio.h>#include<string.h>using namespace std;const int MAXN = 200000010;int a[MAXN];bool b[MAXN];vector <int>sub[155];int main(){    memset(b, 0, sizeof(b));    b[1] = 1;    for(int i = 2; i*i <= MAXN; i++){        if(b[i] == 1)            continue;        for(int j = i*2; j <= MAXN; j += i){            b[j] = 1;        }    }    int times = 0;    for(int i = 2; i <= MAXN; i++){        if(b[i] == 0){            a[times] = i;            times++;        }    }    for(int i = 0; i < times-1; i++){        int temp = a[i+1] - a[i];        if(temp>150)            continue;        sub[temp].push_back(a[i+1]);    }    int m;    scanf("%d", &m);    int sum = 0;    while(m--){       sum++;       long long x, y;       cin >> x >> y;       int temp1 = abs(x - y);       int temp2 = x > y ? x : y;       long long res = 0;       for(int i = 0;i < sub[temp1].size(); i++){            if(sub[temp1][i] >= temp2){                res = sub[temp1][i];                break;            }        }       printf("Case %d: ", sum);       if(res == 0)           puts("-1");       else           printf("%lld\n", res - temp2);    }    return 0;}