Prime Friend
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4638 Accepted Submission(s): 947
Problem Description
Besides the ordinary Boy Friend and Girl Friend, here we define a more academic kind of friend: Prime Friend. We call a nonnegative integer A is the integer B’s Prime Friend when the sum of A and B is a prime.
So an integer has many prime friends, for example, 1 has infinite prime friends: 1, 2, 4, 6, 10 and so on. This problem is very simple, given two integers A and B, find the minimum common prime friend which will make them not only become primes but also prime neighbor. We say C and D is prime neighbor only when both of them are primes and integer(s) between them is/are not.
Input
The first line contains a single integer T, indicating the number of test cases.
Each test case only contains two integers A and B.
Technical Specification
1. 1 <= T <= 1000
2. 1 <= A, B <= 150
Output
For each test case, output the case number first, then the minimum common prime friend of A and B, if not such number exists, output -1.
Sample Input
2 2 4 3 6
Sample Output
Case 1: 1 Case 2: -1
AC代码:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int su[20000005];
bool a[20000010];
bool b[1000];
int main()
{
int T;int t=0;
cin>>T;
memset(a,true,sizeof(a));
a[0]=a[1]=false;
for(int i=2;i<=20000000;i++)
{
if(a[i])
{
su[t++]=i;
for(int j=i+i;j<=20000000;j+=i)
a[j]=false;
}
} memset(b,false,sizeof(b));
for(int i=0;i<t-1;i++)
{
if(su[i+1]-su[i]<=150)
b[su[i+1]-su[i]]=true;
}
for(int k=1;k<=T;k++)
{
int x,y,ans=-1;
cin>>x>>y;
cout<<"Case "<<k<<": ";
if(x<y) swap(x,y);
if(!b[x-y]||x==y)
{
cout<<"-1"<<endl;
}
else
{
for(int i=0;i<t-1;i++)
{
if(su[i+1]-su[i]==x-y&&y<=su[i])
{
ans=su[i]-y;break;
}
}cout<<ans<<endl;
}
}
}