HDU 4715 Difference Between Primes (热身赛第十题)

转载请注明出处:http://blog.csdn.net/a1dark

分析:直接素数打表、

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
bool pri[1000000];
int a[100005];
int b[100005];
struct node{
    int x,y;
}map[200005];
int s=1;
void prim(){
    int i,j;
    for(i=1;i<=200005;i++){//初始化       
        map[i].x=0;
        map[i].y=0;
    }
    memset(pri,true,sizeof(pri));
    for( i=2;i*i<=100005;i++){
        if(pri[i]){
            for(int j=2;j*i<=100005;j++){
                pri[i*j]=false;//素数标记
            }
        }
    }
    for( i=2;i<=100005;i++){
        if(pri[i]){
            b[s]=i;
            a[s++]=i;
        }
    }
    map[100005].x=2,map[100005].y=2;
    for( i=1;i<s;i++){
        for( j=1;j<s;j++){
            if(abs(b[j]-a[i])<=100000){
                if(i==j)
                    continue;
                else{
                    if(map[b[j]-a[i]+100005].x == map[b[j]-a[i]+100005].y && map[b[j]-a[i]+100005].x==0 ){
                         map[b[j]-a[i]+100005].x=b[j];
                         map[b[j]-a[i]+100005].y=a[i];
                    }
                    else{
                        if(map[b[j]-a[i]+100005].x>b[j]){
                            map[b[j]-a[i]+100005].x=b[j];
                            map[b[j]-a[i]+100005].y=a[i];
                        }
                        else if(map[b[j]-a[i]+100005].x==b[j] && map[b[j]-a[i]+100005].y>a[i]){
                            map[b[j]-a[i]+100005].x=b[j];
                            map[b[j]-a[i]+100005].y=a[i];
                        }
                    }
                }
            }
        }
    }
}
int main(){
    prim();
    int t;
    scanf("%d",&t);
    while(t--){
        int a;
        scanf("%d",&a);
        if(map[a+100005].x!=0 && map[a+100005].y!=0 && abs(a)<=100000){
            printf("%d %d\n",map[a+100005].x,map[a+100005].y);
        }
        else
            printf("FAIL\n");
    }
    return 0;
}


你可能感兴趣的:(素数,ACM)