质数,函数【GDOI2018模拟7.8】

题目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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值