题目
题解
这一题我们可以用分类讨论(分类讨论是将一个问题的所有情况一一列举下来)来解决。
如果n是1,输出-1。(这个很重要!不然只有50分!)
如果1~n加起来就已经是个质数了的话,那么证明只需要这一个集合就行了,输出1。
否则如果1加到n不是质数,但是是一个偶数的话,那么根据哥德巴赫猜想,证明只需要2个集合就可以(因为任何一个大于2的偶数都能表示为两个质数的和,而这两个质数一定能被分解为一段连续正整数的和)。
如果1加到n不是质数,但是是一个奇数且减去2是一个质数(比如33)的话,那么证明那个质数只需要一个集合,2也只要一个集合,一共2个集合,输出2。
如果1加到n不是质数,但是是一个奇数且减去3是一个偶数(比如35)的话,那么证明那个偶数需要两个集合,3也要一个集合,一共3个集合,输出3。
代码
#include<bits/stdc++.h>
using namespace std;
int n;
bool prime(int x)
{
if(x==1)return 0;
for(int i=2;i*i<=x;i++) //i只要到根号x就行了
{
if(x%i==0)return 0;
}
return 1;
}
int main()
{
cin>>n;
int m=(1+n)*n/2; //用等差数列求和公式快速求出1到n的和
if(n==1)cout<<-1;
else if(prime(m))cout<<1;
else if(m%2==0)cout<<2;
else if(m%2==1 && prime(m-2))cout<<2;
else if(m%2==1 && !prime(m-2))cout<<3;
else cout<<-1;
return 0;
}