发现相邻的奇数只能恰好差 \(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\n"<<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;
}