CF#324-D-Dima and Lisa-暴力水题-弱哥德巴赫猜想

http://codeforces.com/contest/584/problem/D

给你一个奇数n,让你分解成3个素数。。。并输出。。。

 

。 先令m=n-3,m必为偶数。。。。根据哥德巴赫猜想,任一大于2的偶数都可写成两个质数之和。

。。所以直接打个1e6的素数表

从比n小的素数开始遍历。。找到一个素数X,判断n-X是否为素数就可以了.....纯暴力啊暴力啊。。。。之前不知道一个偶数可以拆分为那么多对质数。。。。

所以就算n是1e9....都可以在1e6范围内找到很多个符合条件的素数..................胆子大这题就能过了微笑

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;


const __int64 mod =1000000007;
 

int judge(int m)
{
	int k=sqrt(m);
	int flag=0;
	for(int i=2;i<=k;i++)//找因数
	{
		if(m%i==0)
		{
			flag=1; 
			break;
		}
	}
	if (!flag)return 1;
	else
		return 0;

}

bool f[1000500]; 
vector<int >sb;
int main()
{
	__int64 i,j;
	f[1]=true;
	for (i=2;i<=1000000;i++)    //1处
	{
		if (f[i]==false)           //优化
		{
			for (j=i*i;j<=1000000;j=j+i)   // 如果1处用1000必须_int64强制转换
			{
				f[j]=true;  
			}
		}
	} 
	for (i=3;i<=1000000;i++)    //1处
	{
		if (f[i]==false)
			sb.push_back(i);
	}
	
	int n;
	
	scanf("%d",&n);
	if (n<13)
	{
		if (n==11||n==3||n==5|n==7)
			printf("1\n%d\n",n);
		else
			printf("3\n3 3 3\n");
		return 0;
	}
	n=n-3; 
	int ans; 
	int it=lower_bound(sb.begin(),sb.end(),n)-sb.begin();
	it--;
	int tmp;
	for (i=it;i>=0;i--)
	{  
		 
		  tmp=n-sb[i];
		if(tmp<3) continue;
		
		if (judge(tmp)==1)
		{
			break;
		}
			continue; 
	}
	printf("3\n");
	printf("3 %d %d\n",n-tmp,tmp);
	   
	   return 0;
	   
} 


你可能感兴趣的:(CF#324-D-Dima and Lisa-暴力水题-弱哥德巴赫猜想)