NOIP 2002 普及组第二题 “选数“ 题解

NOIP普及组|2002T2选数 2002年NOIP普及组第二题:选数 已知n个整数 $x_1,x_2,\cdots,x_n$,以及 $1$ 个整数 $k$($k<n$)。从 $n$ 个整数中任选 $k$ 个整数相加,可分别得到一系列的和。 阅读详情

NOIP 2002 普及组第二题 “选数” 题解

题目描述

已知 (n) 个整数 (x1x_1x1​, x2x_2x2​, \dots, x_n),以及 1 个整数 (k)((k < n))。从 (n) 个整数中任意选 (k) 个整数相加,分别得到一系列的和。例如当 (n = 4, k = 3),4 个整数分别为 3, 7, 12, 19 时,可得全部的组合与它们的和为:

3 + 7 + 12 = 22
3 + 7 + 19 = 29
7 + 12 + 19 = 38
3 + 12 + 19 = 34
现在,要求你计算和为素数共有多少种。

例如上例,只有一种的和为素数:3 + 7 + 19 = 29。

输入格式
第一行两个空格隔开的整数 n, k(1≤n≤20,k<n(1 \leq n \leq 20, k < n(1≤n≤20,k<n)。

第二行 (n) 个整数,分别为x1x_1x1​, x2x_2x2​, …\dots…, xnx_nxn​(1≤xi≤5∗106)(1 \leq x_i \leq 5 *10^6)(1≤xi​≤5∗106)。

输出格式

输出一个整数,表示种类数。

示例
输入

 4 3  
 3 7 12 19

输出

 1

题目大意

给定n个数,从中选出k个数,求和为质数有多少种情况
1≤n≤20,k<n1 \leq n \leq 20, k < n1≤n≤20,k<n
1≤xi≤5∗1061 \leq x_i \leq 5 *10^61≤xi​≤5∗106

分析

考虑到1≤n≤20,k<n1 \leq n \leq 20, k < n1≤n≤20,k<n,本题有两种思路:
① 使用深度优先搜索
② 使用限制数量的子集枚举


解析

挺水的一道题,还是挺简单的

DFS

本题的数据范围只有20,所以用DFS不会超时。
本题可以看作是一个限制数量的子集枚举,并对每一种可能性求和。首先定义vis数组,表示xix_ixi​是否出现过。接着定义void dfs(), 并附带一个int m和long long sum。由于本题还要求合,所以光有一个递归层数m是不行的,需要再加上一个sum变量。在每次的递归中,首先确定递归边界,当m==km == km==k即已经选了k个数时,要判断和是否为质数并记录答案。接着依次遍历xix_ixi​,记录这个解,进行下一次递归,并撤销这个解。

所以代码就是:

int n, k, ans = 0, a[25];
bool vis[25];
bool isPrime(long long x) {
    if (x < 2) return false;
    for (long long i = 2; i * i <= x; ++i) {
        if (x % i == 0) return false;
    }
    return true;
}
//m 递归次数
//sum 当前的和
void dfs(int m, long long sum) {
    if (m == k && isPrime(sum)) {
        ++ans;
        return;
    }
    for (int i = 0; i < n; ++i) {
    	if (vis[i]) {
    	    return;
    	}
        vis[i] = 1;
        dfs(m + 1, sum + a[i]);
        vis[i] = 0;
    }
}

运行后,可以看到正常输出了111😃

限制数量的子集枚举
没啥好说的,套模板就行

bool isPrime(long long x) {
    if (x <= 2) {
        return false;
    }
    for (int i = 2; i * i <= x; ++i) {
        if (x % i == 0) {
            return false;
        }
    }
    return true;
}



int n, k, ans = 0;
cin >> n >> k;
vector<int> a(n + 2);
for (int i = 0; i < n; ++i) {
    cin >> a[i];
}
long long sum = 0;
for (int i = 0; i < (1 << n); ++i) {
    for (int j = 0; j < n; ++j) {
        if (i & (1 << j) && __builtin_popcount(i) == k) {
            sum += a[j];
        }
    }
    if (__builtin_popcount(i) == k) {
        if (isPrime(sum)) {
            ++ans;
        }
        sum = 0;
    }
}

cout << ans;


总而言之,言而总之,水题,没啥难度

2002NOIP普及组:选数 阅读详情

相关推荐

[NOIP2002 普及组] 过河卒

题目描述 棋盘上 AA 点有一个过河卒,需要走到目标 BB 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 CC 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示,AA 点 (0, 0)(0,0)、BB 点 (n, m)(n,m),同样马的位置坐标是需要给出的。 现在要求你计算出卒从AA点能够到达BB点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。 输入格式 一行四个正整数,分别表示B...

熬夜的Alan Walker 3701

NOIP 2002 普及组第二题

dfs

e的博客 484

P1036 [NOIP 2002 普及组] 选数

已知n个整数x1​x2​⋯xn​,以及1个整数kkn从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n4k34个整数分别为37121937122237192971219383121934现在,要求你计算出和为素数共有多少种。371929。

polarours的博客 886

NOIP2002 普及:第二题 选数

【题目描述】 已知nn个整数x1,x2,……xnx1,x2,……xn,以及一个整数K(K<n)K(K<n)。从nn个整数中任选KK个整数相加,可分别 得到一系列的和。例如当n=4n=4,k=3k=3,44个整数分别为3,7,12,193,7,12,19时,可得全部的组合与它们的和为: 3+7+12=22   3+7+19=29   7+12+19=38  3+12+19=34 现在,要求你计算出和为素数共有多少种。 例如上例,只有一种的和为素数:(3+7+19=29)。 【输入】 第一..

absWC的博客 963

【洛谷题解】P1036 [NOIP2002 普及组] 选数

难度相较于之前有一些提升,需要使用DFS算法和判断素数才可以解出来这道题。

一个学生的博客 2834

noip2002普及组

noip 2002 普及组 带数据包题一 级数求和 题二 选数 题三 产生数 题四 过河卒

【题解】【洛谷P1036】【子集枚举】—— [NOIP2002 普及组] 选数

平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。枚举算法题中有这样一类题目,给你一些元素,让你从中选出几个,也就是。:是指全集去除了某个集合后剩下的元素组成的集合,例如。:指两个集合中同时存在的元素组成的集合,可得。在集合中,是包含的一种特殊情况,要判断元素。

Pantheraonca的博客 2612

分离与合体题解(区间DP)

题目: 经过在机房里数日的切磁,LYD从社神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试 杜神牛造了个区域,它们紧邻着排成了一行,编号1-n。在这經个区域里都放着一把OI界 的金钥匙,每一把都有一定的价值,LYD当然想得到它们了。然而杜神牛规定LYD不可以一下子 把它们全部拿走,而是每次只可以拿一把。为了尽快地拿到所有的金钥匙,LYD自然就用上了刚学的分离与合体特技。 开始LYD可以选择从1~n-11~n-11~n-1的任何一个区域(记为K)进入,进入后LYD会在K区域发 生分离,从而分离为两个小L

cqbz_lipengcheng的博客 370

P1036 [NOIP2002 普及组] 选数 题解

P1036 [NOIP2002 普及组] 选数 题解

yaosichengalpha的博客 987

内网Linux服务器离线安装python包

3、将下载的依赖包和requirements.txt 拷贝到内网主机,依赖包和requirements.txt放同一级目录,进入该目录,运行指令。其实还有个更加方便的办法,联网主机装个与内网主机一样环境的虚拟机,在虚拟机中下载py包,拷贝到内网主机后就能直接安装了,省去手动下载py包的步骤。简单记录下最近遇到的一个小问题,内网主机没有内网源,处于无互联网状态,安装python包只能通过联网主机下载好后拷贝到内网主机。由于内网主机安装了多个版本的python,为了防止搞错,使用这种方式来调用pip安装。

cyc头发还挺多的博客 650

Android 13.0仿ios的hotseat效果修改hotseat样式

在13.0系统产品rom定制化开发中,在项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了

安卓兼职framework和app工程师的博客 1144

P1036 [NOIP2002 普及组] 选数 Python题解

已知n个整数x1​x2​⋯xn​,以及1个整数kkn从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n4k34个整数分别为37121937122237192971219383121934现在,要求你计算出和为素数共有多少种。371929。

weixin_52740785的博客 1106

道家学派创始人老子,对 SAP ABAP 这门编程语言的客观评价

SAP HANA 之引入,使 ABAP 于处理大数据,云计算等新兴领域,展现新的生命力,如老吾老以及人之老,幼吾幼以及人之幼,扩展其在信息技术领域的应用,以涵养更广之需。ABAP 能以数据为基,流转于系统之中,如道法自然,顺应企业之生态,助之以高效运转,减少冗杂,简化管理,使企之运营,如小国寡民,无为而治。然 ABAP 如老树盘根,更替不易,面对新兴技术,如云计算、大数据等,其更新之速,未能与时俱进。如水之于渊,柔而能胜刚,ABAP 之发展,顺时而动,应需而变,其在编程领域,犹如道之于万物,渐不可或缺矣。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1023

【题解】【洛谷P1036】【搜索】—— [NOIP2002 普及组] 选数

蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。我们这一篇文章的主角是深搜,就不多讲了,具体细节请看代码。开始枚举,但是要注意后面要预留空间,进行下一次取数。个整数相加,可分别得到一系列的和。输出一个整数,表示种类数。

Pantheraonca的博客 1368

YOLOv12优化:原创自研 | 带有注意力机制的隐藏状态混合器的状态空间(HSM-SSD),实现暴力涨点 | CVPR2025 EfficientViM

可以将 带有注意力机制的隐藏状态混合器的状态空间(HSM-SSD)中的注意力机制换成专栏其他注意力机制 ,那么你就能实现独一无二的原创。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 664

K8S部署Java项目 pod的logs报错为:Error: Unable to access jarfile app.jar

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 2600

P1036 [NOIP 2002 普及组] 选数题解

判断素数、回溯法

triticale的博客 1098

OSG 核心详解

OpenSceneGraph (OSG) 的核心架构、场景图管理以及几何体的绘制

qq_45859163的博客 729

P1002 [NOIP 2002 普及组] 过河卒 c++题解

题目摘要:NOIP2002普及组"过河卒"问题 题目要求计算棋盘上卒从起点(0,0)到终点(n,m)的路径数,卒只能向右或向下移动,且需避开马的控制点(包括马的位置及其8个跳跃点)。 方法对比: 动态规划(最优解): 使用二维数组dp记录路径数 状态转移:dp[i][j] = dp[i-1][j] + dp[i][j-1] 复杂度:O(nm),空间O(nm) 记忆化搜索: 递归实现,配合记忆化数组 复杂度与DP相同但常数更大 BFS: 适合路径追踪但效率低 复杂度:O(2^(n+m)),

syshrgjdkdh的博客 2765

vue2 - 最新详细实现高德地图绘制动态热力图详细教程,在某区域或城市地图上做“热力图层“展示人流量、旅游人口密度、热量图、全国地区地理热力图,利用颜色的深浅表示密度或强度等场景(详细示例代码教程)

vue2,nuxt2,高德地图,热力图,绘制热力图层,报错,卡顿,出不来怎么办,无法关闭,怎么解决这个问题,出错,城市名称,城市某个街道,城区,省份,市区,县城,乡镇,村,各省份的热力图,交通流量,人口流量,密度,旅游出行,人口数量,颜色介绍,深浅代表,人流量,vue2使用高德地图实现某个区域热力图,vue高德地图api加载热力图及关闭,接收热力图数据并渲染热力图,关掉热力图,Vue使用高德API制作热力图,热力图加载不出来,电子围栏围住热力图,vue2中使用高德地图渲染热力图组件,高德地图使用热力图详细教

✅ 精选推荐文章 4201

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[ C++ 真题 ] P1036 [NOIP 2002 普及组] 选数

已知n个整数x1​x2​⋯xn​,以及1个整数kkn从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n4k34个整数分别为37121937122237192971219383121934现在,要求你计算出和为素数共有多少种。371929。

Ω 1011

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

洛谷 P1036 [NOIP2002 普及组] 选数 题解

已知n个整数x1​x2​⋯xn​,以及1个整数kkn从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n4k34个整数分别为37121937122237192971219383121934现在,要求你计算出和为素数共有多少种。371929。

2302_79845772的博客 1232

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

2002 CSP-J/NOIP-J复赛真题精选题解(有代码,行行代码有注释)——秒杀T1 买级数求和,T2 选数,T3 产生数,T4 过河卒

一篇NOIP/CSP-J2002的万字精选题解,全方面地为题目进行了完全详尽、清晰明了的解析,给正在学习信息学的读者提高编程水平,在各大信息学赛事中更好地“秒杀”所有题目。

lixuean0408的博客 1680

题解 P1036 [NOIP2002 普及组] 选数【C/C++】

已知n个整数x1​x2​⋯xn​,以及1个整数kkn从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n4k34个整数分别为37121937122237192971219383121934现在,要求你计算出和为素数共有多少种。371929。

m0_61102549的博客 1052
下一篇: [NOIP2015 普及组] 扫雷游戏 题解
Cat.exe
博客等级 码龄1年 16粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值