题目1(spj)
将1~n分成尽可能少的集合,使得每个集合的和都是质数。
输入
一个数n
输出
样例输入:
8
样例输出:
2
1 2 2 1 1 1 1 2
数据范围:
n<=6000。
解法
可以知道,ans最多为3。
记:m=1+2+……+n=(n+1)n/2;
1.当m为质数时,ans=1;
2.当m为偶数时,根据哥德巴赫猜想,m可以分为两个质数的和,所以ans=2;
3.当m为奇数时,我们可以随便抽一个质数(除了2)出来,剩下的就是一个偶数,转2;ans=3;
先线筛出质数(刚总结完的。。。)。
先判断完情况1。
对于一个奇数,我就把3抽出来新开一组,剩下为偶数。
对于偶数,我们可以把它分成一个较大的质数a与较小的质数b,经过实验发现,b很小,不超过30,所以就把b拿出来开一组,剩下的归为最后一组。
时间O(n)。
代码
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define ll long long
#define fo(i,a,b) for(int