哥德巴赫猜想:任一大于2的偶数都可写成两个质数之和。
弱哥德巴赫猜想:任一大于5的整数都可写成三个质数之和。
题目链接
Description
给1~n每个位置填一个数字,使得每个数字位置编号之和是素数,要求所用数字种数最少
Input
一个整数n(1≤n≤6000)
Output
输出n
个整数表示给这n个位置填的数字,数字从1
开始用
Sample Input
8
Sample Output
1 2 2 1 1 1 1 2
1.如果加起来是质数,所有数是一组。
2.不是质数:a.是偶数,分为两组,即分为两组的和为奇质数。
b.是奇数,2和一个奇质数或者3和两个奇质数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n;
int ans[6005];
bool isprime(int n){
int s=sqrt(n);
for(int i=2;i<=s;i++){
if(n%i==0)return 0;
}
return 1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
ans[i]=1;
}
int s=n*(n+1)/2;
if(!isprime(s)){
if(s%2==0){
for(int i=2;i<=n;i++){
if(isprime(i)&&isprime(s-i)){
ans[i]=2;
break;
}
}
}
else{
if(isprime(s-2))ans[2]=2;
else{
ans[3]=3;
for(int i=2;i<=n;i++){
if(isprime(i)&&isprime(s-3-i)){
ans[i]=2;
break;
}
}
}
}
}
for(int i=1;i<=n;i++){
if(i==n)printf("%d\n",ans[n]);
else printf("%d ",ans[i]);
}
return 0;
}