首页 > 技术文章 > P7200 [COCI2019-2020#1] Lutrija

May-2nd 2021-01-03 22:31 原文

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

推荐阅读