Description
小J手上有1到N这N个数字
现在他想将这些数字分成尽可能少的集合
并且使得每个集合的元素和均为质数。
Format
Input
一行一个正整数n。
0 < = n < = 6000
Output
一行一个正整数m,表示最少集合数,无解输出-1
Samples
输入数据 1
8
Copy
输出数据 1
2
Copy
Hint
对于样例,设有集合1与2
将1到8按下面方式进行划分
1 2 2 1 1 1 1 2
哥德巴赫猜想:任何一个大于2的偶数都能表示为两个质数的和
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,s;
bool pri(int x)
{
if(x < 2) return 0;
if(x == 2) return 1;
for(int i = 2; i <= x / i; i++)
if(x % i == 0)
return 0;
return 1;
}
signed main()
{
scanf("%lld",&n);
if(n == 1)
{
printf("-1");
return 0;
}
s = (1 + n) * n / 2;
if(pri(s) == 1) printf("1");
else if(s % 2 == 0) printf("2");
else
{
if(pri(s - 2) == 1) printf("2");
else if((s - 3) % 2 == 0) printf("3");
}
return 0;
}