【洛谷 P1036】[NOIP2002 普及组] 选数 题解(深度优先搜索+判断质数+枚举子集)

简介: **NOIP2002普及组选数问题**:给定$n$个整数和一个整数$k$,需找出所有$k$个数的组合,计算它们的和为素数的种类数。输入包含$n$和$k$,以及$n$个整数;输出是符合条件的组合数。例如,对于输入`4 3`和数组`[3, 7, 12, 19]`,输出为`1`。代码使用递归枚举子集并检查质数的方法。

[NOIP2002 普及组] 选数

题目描述

已知 $n$ 个整数 $x_1,x_2,\cdots,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 \le n \le 20$,$k<n$)。

第二行 $n$ 个整数,分别为 $x_1,x_2,\cdots,x_n$($1 \le x_i \le 5\times 10^6$)。

输出格式

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

样例 #1

样例输入 #1

4 3
3 7 12 19

样例输出 #1

1

提示

【题目来源】

NOIP 2002 普及组第二题

思路

通过搜索枚举子集,判断质数后计数。

AC代码

#include <iostream>
#include <cmath>
#define AUTHOR "HEX9CF"
using namespace std;

const int maxn = 100005;

int n, k;
int cnt = 0;
int a[maxn], b[maxn];

bool pn(int x)
{
   
    if (x <= 1)
    {
   
        return false;
    }
    for (int i = 2; i < sqrt(x); i++)
    {
   
        if (!(x % i))
        {
   
            return 0;
        }
    }
    return true;
}

void f(int x, int y)
{
   
    if (x == k)
    {
   
        int sum = 0;
        for (int i = 0; i < k; i++)
        {
   
            // cout << b[i] << " ";
            sum += b[i];
        }
        if (pn(sum))
        {
   
            cnt++;
        }
        // cout << endl;
        return;
    }
    for (int i = y + 1; i <= n; i++)
    {
   
            b[x] = a[i];
            f(x + 1, i);
    }
}

int main()
{
   
    b[0] = 0;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
    {
   
        cin >> a[i];
    }
    f(0, 0);
    cout << cnt << endl;
    return 0;
}
目录
相关文章
|
C++
【PTA】​L1-006 连续因子​(C++)
【PTA】​L1-006 连续因子​(C++)
900 0
【PTA】​L1-006 连续因子​(C++)
|
数据安全/隐私保护
【洛谷 P1928】外星密码 题解(递归+字符串)
外星密码挑战涉及解压缩由重复子串压缩的字符串,如`[3FUN]`代表`FUNFUNFUN`。输入是一行压缩过的字符串,输出是解压缩的结果。代码使用递归方法,遇到`[`读取重复次数并解压下一层,遇到`]`返回当前层结果,否则直接添加字符。样例输入`AC[3FUN]`输出`ACFUNFUNFUN`。处理的数据限制为解压后长度在20000内,最多十重压缩。
679 0
|
NoSQL 关系型数据库 MySQL
分布式系统,从CAP定理说起
本文作者笠泱分享了对分布式系统及其核心理论的理解,包括分布式系统的概念、单体架构的局限性以及网络运算常见误区。重点解析了CAP定理(一致性、可用性、分区容错性三者不可兼得)和BASE理论(基本可用、软状态、最终一致性)。同时探讨了如何判定CP与AP系统,并结合Nacos、MySQL、Redis等实例分析其特性。最后总结分布式架构设计需关注高可用、高性能等六大指标,强调微服务与分布式解决方案的重要性。
1056 14
|
安全 网络安全 网络架构
升级到 Windows 11 后 Wi-Fi 无法使用?Windows 11 升级更新后 WiFi 无法上网?
升级到 Windows 11 后可能出现 Wi-Fi 问题?本文提供两种修复方法:一是使用 Win 系统修复工具,二是通过驱动人生更新网卡驱动。同时详解排查网络问题的步骤,包括检查硬件、修复驱动、调整防火墙设置等,助你快速恢复网络连接。
2311 0
【洛谷 P1618】三连击(升级版)题解(循环枚举+全排列)
该编程题目要求将数字1到9分为三组,形成三个三位数,使得这三个数成比例A:B:C。输入为A、B、C的值,输出符合条件的三位数组合,按首个数字升序排列。样例输入为1 2 3,输出多组解。代码使用全排列遍历数字,检查比例关系。若无解,则输出&quot;No!!!&quot;。
521 0
|
C语言
【C语言程序设计——循环程序设计】鸡兔同笼问题(头歌实践教学平台习题)【合集】
本教程介绍了循环控制和跳转语句的使用,包括 `for`、`while` 和 `do-while` 循环,以及 `break` 和 `continue` 语句。通过示例代码详细讲解了这些语句的应用场景,并展示了如何使用循环嵌套解决复杂问题,如计算最大公因数和模拟游戏关卡选择。最后,通过鸡兔同笼问题演示了穷举法编程的实际应用。文中还提供了编程要求、测试说明及通关代码,帮助读者掌握相关知识并完成任务。 任务描述:根据给定条件,编写程序计算鸡和兔的数量。鸡有1个头2只脚,兔子有1个头4只脚。
1012 5
1314:【例3.6】过河卒(Noip2002)
1314:【例3.6】过河卒(Noip2002)
490 0
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
2087 8
|
小程序 前端开发 算法