发现相邻的奇数只能恰好差 (2)(偶质数只有 (2))。
而大于 (1) 的连续的奇数有且仅有一个能被 (3) 整除,也就是说三个连续的奇数至多有两个是质数。
所以相邻的奇数最多只有两个。
但我们可以放偶质数 (2)。显然,放多个 (2) 肯定不优。
于是我们就有 A A-2/A+2 2 B-2/B+2 B
这样的构造形式,根据情况可以省略部分。
这样就能过了,本着精益求精的精神我们继续探究。
拿 (A) 来讲,要存在合法的条件必须满足 (A) 是孪生质数中的一个。
假设 (A) 和 (A-2) 是质数,我们显然不需要构造一个 (A-2) 项因为 (A) 和 (2) 的差就是 (A-2)。
所以就可以少判断 (A-2) 这一项啦。
时间复杂度 (O(sqrt A))。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define For(i,x,y)for(i=x;i<=(y);i++)
ll c[6];
bool prime(ll p)
{
if(p<2)return 0;
int i;
For(i,2,sqrt(p))
if(!(p%i))return 0;
return 1;
}
int main()
{
ll a,b;
cin>>a>>b;
if(a==2&&b==2)cout<<-1,exit(0);
if(llabs(a-b)==2)cout<<"2
"<<a<<' '<<b,exit(0);
int x,y,d=0,i;
x=(prime(a-2)?1:(prime(a+2)?2:(a==2?3:0)));
y=(prime(b-2)?1:(prime(b+2)?2:(b==2?3:0)));
if(!x||!y)cout<<-1,exit(0);
c[++d]=a;
if(x==2)c[++d]=a+2;
if(x!=3&&y!=3)c[++d]=2;
if(y==2)c[++d]=b+2;
c[++d]=b;
cout<<d<<endl;
For(i,1,d)cout<<c[i]<<' ';
return 0;
}