题目连接:
题目已经把题意说的很清楚了
就是把一个数n拆成4个质数的和
数据规模是10^7,所以直接打一个10^7的素数表是可行的(大概500MS就可以完成)
思路:
首先要明确以下观点:
当n小于等于7的时候不可能有解
这个道理很显然,因为当n==8的时候可以拆成2+2+2+2(四个最小的素数了)
所以n<8不可能在存在分解方法
故:第一步为判断n是否大于等于8
那么剩下就是证明n大于等于8的时候是否一定存在可行解
答案是肯定的!!!!
我的证明非常简单(之前的方法确实是想复杂了)
当n为一个偶数的时候,那么他一定可以分解为两个偶数的和
而在假设哥德巴赫猜想成立的条件下,偶数是一定可以分解为两个质数的和的。所以,n也一定能够分解为4个素数的和
然后就是n为奇数的时候
当n为奇数,我们可以把它拆分为两个偶数和一个1的和
进一步猜想,我们一定可以写成2+3+偶数的形式(这么做是有原因的!!主要是为了实现方便)
我的代码:
#define maxn 10000001
bool flag[maxn];
int prime[1000000];
int num=0;
void init()
{
unsigned long i,j;
memset(flag,0,sizeof(flag));
flag[1]=true;
flag[0]=true;
for(i=2;i<maxn;i++)
{
if(!flag[i])
{
prime[num++]=i;
for(j=i*i;j<maxn;j=j+i)
flag[j]=true;
}
}
}
int main()
{
int i,a,b,c,d,n;
init();
while(scanf("%d",&n)!=EOF)
{
if(n<=7)
{
printf("Impossible./n");
continue;
}
if(n&1)
{
a=2;
b=3;
n=n-5;
for(i=0;i<num;i++)
{
if(!flag[n-prime[i]])
{
c=prime[i];
d=n-prime[i];
break;
}
}
printf("%d %d %d %d/n",a,b,c,d);
}
else
{
a=2;
b=2;
n=n-4;
for(i=0;i<num;i++)
{
if(!flag[n-prime[i]])
{
c=prime[i];
d=n-prime[i];
break;
}
}
printf("%d %d %d %d/n",a,b,c,d);
}
}
return 0;
}