原题链接:https://www.luogu.com.cn/problem/P1832

A+B Problem(再升级)

题目背景

·题目名称是吸引你点进来的

·实际上该题还是很水的

题目描述

·1+1=? 显然是2

·a+b=? 1001回看不谢

·哥德巴赫猜想 似乎已呈泛滥趋势

·以上纯属个人吐槽

·给定一个正整数n,求将其分解成若干个素数之和的方案总数。

输入格式

一行:一个正整数n

输出格式

一行:一个整数表示方案总数

输入输出样例
输入 #1

7

输出 #1

3

说明/提示

【样例解释】

7=7 7=2+5

7=2+2+3

【福利数据】

【输入】 20

【输出】 26

【数据范围及约定】

对于30%的数据 1<=n<=10

对于100%的数据,1<=n<=10^3

题解

在做这道题的时候,我才发现我之前对这种方案累计的正确性理解不够深刻。

看到这道题,很自然的,我们会联想到自然数的分解这道题,而A+BA+BA+B这道题则相当于是自然数分解的升级版。要真正理解这种完全背包的做法,还是要先从自然数分解说起。

以下为自然数分解的代码(摘自上面链接的博客):

dp[0]=1;
for(int i=1;i<=n;++i)
for(int j=0;j<=n;++j)
if(dp[j]&&j+i<=n)dp[i+j]+=dp[j];

(注:ififif里面要求的dp[j]dp[j]dp[j]为真大可不必,因为dp[i+j]+=dp[j]dp[i+j]+=dp[j]dp[i+j]+=dp[j]时如果dp[j]dp[j]dp[j]为000加上去也没有什么影响)

让我们来理解一下这个双重循环到底是什么东西:

这个转移方程的逻辑为对:于每个iii,直接从000到nnn枚举所有数jjj,把(i+j)(i+j)(i+j)这个数拆分为完整的iii和散装的jjj,相当于在jjj的所有拆分方案上都加上一个iii成为(i+j)(i+j)(i+j)这个数的部分拆分方案,所以就有了dp[i+j]+=dp[j]dp[i+j]+=dp[j]dp[i+j]+=dp[j]。

那么这样为什么可以不重不漏呢?首先我们要知道第一个循环走到iii时,dpdpdp数组的值为只能将数字拆分为1∼i−11\sim i-11∼i−1的方案数,也就是说dp[1]∼dp[i−1]dp[1]\sim dp[i-1]dp[1]∼dp[i−1]的值均为最终答案,因为它们不可能被拆分为≥i\ge i≥i的数;而对于dp[i]∼dp[n]dp[i]\sim dp[n]dp[i]∼dp[n]来说,这就只是一部分的方案,所以我们再把当前的iii作为新元素加入到原来只有1∼i−11\sim i-11∼i−1的方案里,构成拆分(i+j)(i+j)(i+j)的新方案。因为每次加入的iii都是之前没有的元素,所以拆分方法一定是船新的,这样就可以统计完所有方案。

回到这道A+BProblemA+B\ ProblemA+B Problem,我们在做自然数时每次新增的是iii,那么对于这道拆分质数的题就应该新增一个质数。所以在代码中,枚举素数在外层,枚举0∼n0\sim n0∼n在内层,这样就可以达到与上述自然数拆分一样的效果,即在外层枚举到素数p[i]p[i]p[i]时,dp[j]dp[j]dp[j]中的方案数仅为将jjj拆分为0∼p[i−1]0\sim p[i-1]0∼p[i−1]的方案数,保证了我们的方案不重不漏。

至于找出素数,可以参考线性筛素数。

代码

如果不是全WA\mathcal{WA}WA我都忘了Linux\mathcal{Linux}Linux上用%I64d会凉凉了。

#include<bits/stdc++.h>
using namespace std;
const int M=1005;
int p[M];
long long dp[M];
bool check[M];
int n;
void in()
{scanf("%d",&n);
}
void get()
{check[1]=1;for(int i=2;i<=n;++i){if(!check[i])p[++p[0]]=i;for(int j=1,t;j<=p[0];++j){t=i*p[j];if(t>n)break;check[t]=1;if(i%p[j]==0)break;}}
}
void ac()
{get();dp[0]=1;for(int i=1;i<=p[0];++i)for(int j=0;j<=n;++j)if(j+p[i]<=n)dp[j+p[i]]+=dp[j];printf("%lld",dp[n]);
}
int main()
{in(),ac();
}

Luogu1832 A+B Problem(再升级)相关推荐

  1. x10i升级android4.0,智再升级 Xperia X10i升Android 2.3

    智再升级 Xperia X10i升Android 2.3 2011年08月04日 16:08作者:LEE编辑:李军工文章出处:泡泡网原创 分享 近日索尼爱立信官方表示,从即日起中国大陆地区用户可通过官 ...

  2. qtdesigner右击按钮没有 to slot_或添加“力感按钮”再升级,Apple Pencil会更“能打”?...

    [钉科技编译]"I have a pen/I have an apple/Ah apple pen",钉科技编辑写到的这些"歌词",看上去是不是很熟悉?对了,这 ...

  3. 性能提升3倍、时延降低70%,阿里云企业级存储ESSD云盘再升级!

    9月22日,阿里云存储年度新品发布会上,阿里云基础产品资深产品总监陈起鲲发布了其全球领先的旗舰级块存储产品ESSD的两款新规格(ESSD Auto PL.ESSD PL-X),并宣布了新增的多项企业级 ...

  4. 金山云发布全新Serverless产品 云原生基础设施再升级

    随着企业数字化转型的深入,云计算正全面步入2.0时代,即为云而生的阶段.以云原生为代表的理念,已经成为进一步释放云计算价值的核心推动力. 1月6日,金山云举行了云原生媒体沟通会,金山云副总裁.合伙人钱 ...

  5. 互联网日报 | TikTok将开启Pre-IPO融资;菜鸟裹裹战略再升级;滴滴中国西区总部落户重庆江北...

    今日看点 ✦ 字节跳动:TikTok Pre-IPO轮融资不排除还会引入其他投资者 ✦ 腾讯:Wecom是企业微信海外版,和WeChat是完全不同的产品 ✦ 菜鸟裹裹宣布战略再升级,未来一年服务用户翻 ...

  6. 牧马人鼠标g13鼠标宏_经典再升级:达尔优牧马人五代游戏鼠标

    经典再升级:达尔优牧马人五代游戏鼠标 牧马人系列可以说是达尔优的翻身之作,从一个名不见经传的小厂到现在有多见地,多款产品得到消费者的认可,或多或少是因为达尔优的经典牧马人系列带来的口碑与销量. 而牧马 ...

  7. oracle delphi唱盘,经典再升级 Oracle Delphi MK VI Gen 2

    加拿大Oracle最出名的产品,莫过于Delphi黑胶唱盘,Delphi在1979年首度问世,外观设计的基本模样,就和现在Delphi MK VI Gen 2几乎一模一样,三点式避振外加铝合金一体成型 ...

  8. ofo 回应假装老外秒退押金;董明珠雷军十亿赌约到期;高通苹果摩擦再升级 | 极客头条...

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 快讯速知 董 ...

  9. 安卓3d游戏开发引擎_鲁大师安卓3D引擎更新,跑分测试精准度再升级

    去年十月份的时候,鲁大师曾发布了针对安卓性能跑分的重大升级版本v9.0.与国内知名游戏工作室"西山居"合作,更换了全新的Unity 3D渲染引擎,又将原有的测试项目进行了部分精简, ...

  10. 金山云智能营销平台再升级,AI 投放助力游戏厂商精准到达;微医发布 AI 解决方案,提升县域医疗服务能力...

    微医发布互联网+AI云化解决方案,提升县域医疗服务能力 10月21日,第四届中国县域卫生发展论坛暨全国首届医联体建设大会在成都召开.会上,智能医疗云平台--微医发布了基于睿医云技术开发的"县 ...

最新文章

  1. 图灵奖得主Jeff Ullman直言:机器学习不是数据科学的全部!统计学也不是
  2. php mysql编译安装目录_Linux下Apache PHP MySQL默认安装路径
  3. Android SDK content Loader has encountered a problem.parseSdkContent failed
  4. 完美解决Linux服务器tomcat开机自启动问题
  5. 一文读懂TOF深度相机技术原理--TI-Tintin-OPT8241二次开发和应用系列--Theory Level
  6. java列出文件正则过滤_JAVA正则表达式过滤文件的实现方法
  7. linux 进程管理 ppt,Linux内核结构与进程管理.ppt
  8. 使用ADOMD.NET获取Analysis Services元数据
  9. linux route配置网关,Linux使用route配置路由
  10. android mapstring, string遍历,MapString, String 遍历的四种方法
  11. 陕西网络培训学院自动学习简易脚本
  12. C语言之数组的正向逆向输出
  13. #年轻人找工作应该把钱放第一位吗#
  14. 最全Web前端面试题汇总 笔试题汇总 JavaScript HTML css
  15. crc 校验错误_信道编码之循环冗余校验(CRC)
  16. Linux C遍历文件夹
  17. 瘦臀瘦腿的最快方法是什么?
  18. swiper修改轮播图下面小圆圈样式
  19. 链接被微信拦截(被封锁、被屏蔽、被和谐)最新方法
  20. linux的内置的账户_Linux用户和用户配置文件(注意nobody用户)

热门文章

  1. servlet后端连接 微信小程序与_微信小程序授权登录
  2. Java修改带回显吗_修改的是根据自定义标签进行处理回显
  3. Codeforces 1013
  4. python:生成器
  5. 从此使用linux系统,但是QQ是必不可少的!!该篇文章方法成功!!!已验证!!!!!...
  6. 数组及引用类型内存分配
  7. 又延伸到socket去了。
  8. 《Android开发卷——HTTP网络通信,HTTP网络连接》
  9. 16. 页框回收 2010-02-28 22:56 591人阅读 评论(0) 收藏...
  10. MPI集群安装、MPI安装