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;
}