#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<limits.h>
#include<algorithm>
#include<iomanip>
#include<stdlib.h>
using namespace std;
const unsigned MAXN=4294967290;//本来开const long long 结果一直是大串怪异报错信息
//const int MAXN2=10000;//本来也是const long long
bool isprime[MAXN];
int prime[MAXN];
int indexs[MAXN];//记录素数索引,即素数是第几个
int a,b;
bool up_key;//用up_key 判断升序降序
int ans[35];//其中ans[0]记录当前列表内元素个数
int cnt=0;
bool ans_key=false;
int max_prime,min_prime,max_index,min_index;
void euler_prime(){
memset(isprime,true,sizeof(isprime));
memset(prime,0,sizeof(prime));
isprime[1]=0;
for(unsigned i=2;i<=MAXN;++i){
if(isprime[i])prime[++prime[0]]=i;
for(int j=1;j<=prime[0];++j){
if(i*prime[j]>MAXN)break;
isprime[i*prime[j]]=false;
if(i%prime[j]==0)break;
}
}
}//O(n)筛素数
//将素数表记录在prime数组中,将数的信息记录在isprime数组中
void dfs(){
if(ans[0]>30)return;
int first_prime=ans[ans[0]-1];//first是指倒数第二个数
int first_index=indexs[first_prime];
for(int i=first_index+1;i<max_index;++i){
if(isprime[prime[i]-first_prime]){
if(isprime[max_prime-prime[i]]){
ans_key=true;
return;
}
++ans[0];
ans[ans[0]]=ans[ans[0]-1];
ans[ans[0]-1]=prime[i];
dfs();
if(ans_key)return;
--ans[0];
ans[ans[0]]=ans[ans[0]+1];
}
}
}
void cout_ans(){
if(ans_key){
cout<<ans[0]<<endl;
if(up_key){
for(int i=1;i<=ans[0];++i){
cout<<ans[i]<<" ";
}
}else{
for(int i=ans[0];i>=1;--i){
cout<<ans[i]<<" ";
}
}
}else{
cout<<-1;
}
}
int main(){
cin>>a>>b;
up_key=a>b?false:true;
euler_prime();
for(int i=2;i<=10000;++i){
if(isprime[i])indexs[i]=++cnt;
}
if(up_key){
max_prime=b;
min_prime=a;
max_index=indexs[b];
min_index=indexs[a];
}else{
max_prime=a;
min_prime=b;
max_index=indexs[a];
min_index=indexs[b];
}
ans[1]=min_prime;
ans[2]=max_prime;
ans[0]=2;//前列表内元素个数
if(isprime[abs(ans[2]-ans[1])]){
ans_key=true;
cout<<"=====";
goto cout_anss;
}
dfs();
cout_anss:
cout_ans();
return 0;
}
欲哭无泪哭死我了,仅以此证明我来过,怎敢奢望有大犇能抽时间看看这一团老太太裹脚布--又臭又长的代码呢?QAQ