【NOIP普及组】 选数

【NOIP普及组】 选数


💐The Begin💐点点关注,收藏不迷路💐

已知 n 个整数 x1,x2,…,xn,以及一个整数 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)
x1,x2,…,xn (1<=xi<=5000000)

输出

屏幕输出,格式为:
一个整数(满足条件的种数)。

样例输入

4 3
3 7 12 19

样例输出

1

C 语言实现的代码:

#include <stdio.h>
#include <stdbool.h>
#include <math.h>

// 判断一个数是否为素数
bool isPrime(int num) {
    // 如果小于 2 不是素数
    if (num < 2) return false;
    // 2 和 3 是素数
    if (num == 2 || num == 3) return true;
    // 能被 2 或 3 整除不是素数
    if (num % 2 == 0 || num % 3 == 0) return false;
    int i = 5;
    int w = 2;
    // 从 5 开始用特定方式判断是否为素数
    while (i * i <= num) {
        // 如果能被 i 整除不是素数
        if (num % i == 0) return false;
        i += w;
        w = 6 - w;
    }
    return true;
}

int main() {
    int n, k;
    // 输入整数个数 n 和要选的个数 k
    scanf("%d %d", &n, &k);
    int arr[20];
    for (int i = 0; i < n; i++) {
        // 输入 n 个整数
        scanf("%d", &arr[i]);
    }
    int count = 0;
    // 生成所有可能的组合
    for (int i = 0; i < (1 << n); i++) {
        int selectedCount = 0;
        int sum = 0;
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                // 当前位被选中,计数加一,累加和
                selectedCount++;
                sum += arr[j];
            }
        }
        if (selectedCount == k && isPrime(sum)) {
            // 如果选中的个数等于 k 且和为素数,计数加一
            count++;
        }
    }
    // 输出满足条件的种数
    printf("%d\n", count);
    return 0;
}

在这里插入图片描述

以下是对这段 C 语言代码的解析:

一、整体功能概述

这段代码的目的是计算从给定的n个整数中任选k个整数相加,其和为素数的组合数。

二、函数解析

  1. isPrime函数:

    • 这个函数用于判断一个整数是否为素数。
    • 首先处理小于 2 的情况,小于 2 的数不是素数,直接返回false
    • 接着判断 2 和 3 是素数,直接返回true
    • 对于大于 3 的数,先判断是否能被 2 或 3 整除,如果能则不是素数,返回false
    • 然后从 5 开始,使用一种特定的方式进行判断,通过循环不断尝试可能的因子,直到尝试的数的平方大于要判断的数为止。如果在这个过程中发现能整除的情况,就返回false,否则返回true
  2. main函数:

    • 输入部分
      • 首先从标准输入读取整数个数n和要选的个数k
      • 接着使用一个循环读取n个整数并存入数组arr中。
    • 计数部分
      • 初始化计数变量count为 0。
      • 通过一个循环遍历从 0 到(1 << n) - 1的所有整数,这个循环实际上是在生成所有可能的组合。因为对于n个元素,总共有2^n种不同的选取方式,每一种选取方式可以用一个n位的二进制数表示,其中每一位对应一个元素,如果该位为 1 则表示选取该元素,为 0 则表示不选取。
      • 在这个循环内部,对于每一个整数i,使用两个变量selectedCountsum分别记录当前组合中被选中的元素个数和它们的和。通过遍历数组arr,如果i的二进制表示中对应位置为 1,则将该位置的元素加入和中,并增加选中元素的个数。
      • 如果选中的元素个数等于k并且这个和是素数(通过调用isPrime函数判断),则增加计数变量count
    • 输出部分
      • 最后将满足条件的组合数输出到标准输出。

三、时间复杂度和空间复杂度分析

  1. 时间复杂度:
    • isPrime函数的时间复杂度近似为 O ( n ) O(\sqrt{n}) O(n ),其中n是要判断的整数。
    • main函数中的外层循环遍历所有可能的组合,时间复杂度为 O ( 2 n ) O(2^n) O(2n),其中n是输入的整数个数。内层循环遍历输入的数组,时间复杂度为 O ( n ) O(n) O(n)。因此总体时间复杂度为 O ( 2 n ∗ n ) O(2^n * n) O(2nn)加上判断素数的时间复杂度,近似为 O ( 2 n ∗ n + 2 n ∗ m ) O(2^n * n + 2^n *\sqrt{m}) O(2nn+2nm ),其中m是可能的最大和,通常远小于 2 n ∗ n 2^n * n 2nn,所以总体时间复杂度可以近似为 O ( 2 n ∗ n ) O(2^n * n) O(2nn)
  2. 空间复杂度:
    • 主要的空间消耗来自存储输入的整数数组arr,空间复杂度为 O ( n ) O(n) O(n),其中n是输入的整数个数。

C++实现的代码:

#include <iostream>
#include <vector>
#include <cmath>

// 判断一个数是否为素数
bool isPrime(int num) {
    // 如果小于 2 不是素数
    if (num < 2) return false;
    // 2 和 3 是素数
    if (num == 2 || num == 3) return true;
    // 能被 2 或 3 整除不是素数
    if (num % 2 == 0 || num % 3 == 0) return false;
    int i = 5;
    int w = 2;
    // 从 5 开始用特定方式判断是否为素数
    while (i * i <= num) {
        // 如果能被 i 整除不是素数
        if (num % i == 0) return false;
        i += w;
        w = 6 - w;
    }
    return true;
}

int main() {
    int n, k;
    // 输入整数个数 n 和要选的个数 k
    std::cin >> n >> k;
    std::vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        // 输入 n 个整数
        std::cin >> arr[i];
    }
    int count = 0;
    // 生成所有可能的组合
    for (int i = 0; i < (1 << n); i++) {
        int selectedCount = 0;
        int sum = 0;
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                // 当前位被选中,计数加一,累加和
                selectedCount++;
                sum += arr[j];
            }
        }
        if (selectedCount == k && isPrime(sum)) {
            // 如果选中的个数等于 k 且和为素数,计数加一
            count++;
        }
    }
    // 输出满足条件的种数
    std::cout << count << std::endl;
    return 0;
}

Java 实现的代码:

import java.util.Scanner;

class PrimeSumCombination {
    // 判断一个数是否为素数
    public static boolean isPrime(int num) {
        // 如果小于 2 不是素数
        if (num < 2) return false;
        // 2 和 3 是素数
        if (num == 2 || num == 3) return true;
        // 能被 2 或 3 整除不是素数
        if (num % 2 == 0 || num % 3 == 0) return false;
        int i = 5;
        int w = 2;
        // 从 5 开始用特定方式判断是否为素数
        while (i * i <= num) {
            // 如果能被 i 整除不是素数
            if (num % i == 0) return false;
            i += w;
            w = 6 - w;
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        // 输入整数个数 n
        int k = scanner.nextInt();
        // 输入要选的个数 k
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            // 输入 n 个整数
            arr[i] = scanner.nextInt();
        }
        int count = 0;
        // 生成所有可能的组合
        for (int i = 0; i < (1 << n); i++) {
            int selectedCount = 0;
            int sum = 0;
            for (int j = 0; j < n; j++) {
                if ((i & (1 << j))!= 0) {
                    // 当前位被选中,计数加一,累加和
                    selectedCount++;
                    sum += arr[j];
                }
            }
            if (selectedCount == k && isPrime(sum)) {
                // 如果选中的个数等于 k 且和为素数,计数加一
                count++;
            }
        }
        // 输出满足条件的种数
        System.out.println(count);
    }
}

Python 实现的代码:

def is_prime(num):
    # 如果小于 2 不是素数
    if num < 2:
        return False
    # 2 和 3 是素数
    if num == 2 or num == 3:
        return True
    # 能被 2 或 3 整除不是素数
    if num % 2 == 0 or num % 3 == 0:
        return False
    i = 5
    w = 2
    # 从 5 开始用特定方式判断是否为素数
    while i * i <= num:
        # 如果能被 i 整除不是素数
        if num % i == 0:
            return False
        i += w
        w = 6 - w
    return True

n, k = map(int, input().split())
# 输入整数个数 n 和要选的个数 k
arr = list(map(int, input().split()))
# 输入 n 个整数
count = 0
# 生成所有可能的组合
for i in range(1 << n):
    selected_count = 0
    s = 0
    for j in range(n):
        if i & (1 << j):
            # 当前位被选中,计数加一,累加和
            selected_count += 1
            s += arr[j]
    if selected_count == k and is_prime(s):
        # 如果选中的个数等于 k 且和为素数,计数加一
        count += 1
print(count)
# 输出满足条件的种数

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901069.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速排序(hoare版本)

文章目录 文章目录 前言 二、使用步骤 1.实现基准值 2.递归实现排序 3.三数取中 三.注意事项 总结 前言 我们之前学习的多种排序&#xff0c;它们都有着不同的效率&#xff0c;可以适用与不同的场景&#xff0c;接下来要说的一种排序它叫做快速排序&#xff0c;从它的名字就可…

从产品经理到AI产品经理,这波升职加薪我把握住了

2024年&#xff0c;还有什么新风口&#xff1f; AI、元宇宙、NFT… 很多人不知道&#xff0c;其实不管是元宇宙还是NFT&#xff0c;它们本质上就是人工智能领域。 AI自身应用领域非常广泛&#xff0c;大批高薪岗位随之涌了出来&#xff0c;包括AI产品经理。 AI产品经历具体工…

微软运用欺骗性策略大规模打击网络钓鱼活动

微软正在利用欺骗性策略来打击网络钓鱼行为者&#xff0c;方法是通过访问 Azure 生成外形逼真的蜜罐租户&#xff0c;引诱网络犯罪分子进入以收集有关他们的情报。 利用收集到的数据&#xff0c;微软可以绘制恶意基础设施地图&#xff0c;深入了解复杂的网络钓鱼操作&#xff…

数字化工厂:制造业转型的新引擎

在当前技术飞速发展的时代,数字化正以前所未有的速度深入到各个行业,推动着产业转型升级。制造业作为国民经济的支柱,更是数字化转型的重点领域。随着5G、大数据、云计算、人工智能等新一代信息技术的广泛应用,以及国家"工业4.0"、"中国制造2025"等政策的持…

05-服务保护和分布式事务

原文为黑马程序员的飞书云文档&#xff0c;链接在这&#xff1a;原文链接 在微服务的远程调用中&#xff0c;还存在几个问题需要解决&#xff1a; 首先是业务健壮性问题&#xff1a; 在之前的查询购物车列表的业务中&#xff0c;购物车服务需要查询最新的商品信息&#xff0…

语音语言模型最新综述! 关于GPT-4o背后技术的尝试

近期,大型语言模型(LLMs)在生成文本和执行各种自然语言处理任务方面展现出了卓越的能力,成为了强大的AI驱动语言理解和生成的基础模型。然而&#xff0c;仅依赖于基于文本模态的模型存在显著局限性。这促使了基于语音的生成模型的发展,使其能够更自然、直观地与人类互动。 为了…

Prism 四事件聚合器

#1024程序员节&#xff5c;征文# 不废话&#xff0c;直接上代码一个简单的示例。 1、事件聚合 创建一个文件夹EventBLL&#xff0c;添加EventDemo.cs&#xff0c;代码如下。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using …

SpringMVC6-SpringMVC的视图

目录 ThymeleafView 转发视图 重定向视图 视图控制器view-controller SpringMVC中的视图是View接口&#xff0c;视图的作用&#xff1a;渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图InternalResourceView 和重定…

卷积神经网络评价指标

1.评价指标的作用 1. 性能评估&#xff1a;评价指标提供了一种量化的方式来衡量CNN模型的性能。通过这些指标&#xff0c;我们可以了解模型在特定任务上的表现&#xff0c;比如图像分类、目标检测或图像分割等。 2. 模型比较&#xff1a;不同的模型架构或训练策略可能会产生不…

UWA Gears:Frame Capture模式 - 着色器查看器

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 在上周的文章中&#xff0c;我们详细介绍了网格查看器的功能&#xff0c;介绍如何通过网格数据优化…

Deepin V23 / 统信UOS 下安装与配置 tftp

几个月前&#xff0c;我将开发系统从 ubuntu 切换到 Deepin&#xff0c;当时写过一篇文章《使用国产操作系统作为开发系统》。几个月下来&#xff0c;没有感觉有什么不适应&#xff0c;Ubuntu 能做的事情&#xff0c;在 Deepin 上都能做。而且有 UOS 应用商店的加持&#xff0c…

Linux: Shell编程入门

Shell 编程入门 1 ) Shell 概念 shell 是 在英语中 壳, 外壳的意思可以把它想象成嵌入在linux这样的操作系统里面的一个微型的编程语言不像C语言, C 或 Java 等编程语言那么完整&#xff0c;它可以帮我们完成很多自动化任务例如保存数据监测系统的负载等等&#xff0c;我们同样…

数学之三角函数

小时候总是听别人讲甚么三角函数&#xff0c;感觉十分高大上&#xff0c;像是很深奥的知识。 今天我来讲解一下三角函数&#xff0c;首先就是概念了。 三角函数的概念&#xff08;初中&#xff09;&#xff08;入门难度&#xff09; 三角函数顾名思义就属于函数。那么它和三角…

51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25

51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25 声明:本文图片来源于网络 A模拟信号特点: 电压或者电流 缓慢上升 随着时间连续缓慢上升或下降 D数字信号特点:电压或者电流 保持一段时间的高/低电平 状态 / 突变 (高电压瞬间低电压) 数字电路中 通常将0-1v电压称…

JavaScript高级特性速成指南:原型链、严格模式、高阶函数、闭包、递归、浅拷贝和深拷贝

如果生活中有什么使你感到快乐&#xff0c;那就去做吧&#xff0c;不要管别人说什么 文章目录 原型链严格模式高阶函数闭包递归浅拷贝和深拷贝 原型链 概念&#xff1a;就是串联起来的结构作用&#xff1a;提供一个成员的查找机制或者查找规则 Javascript的成员查找机制(规则)…

resources下lib文件中的jar包怎么添加到git

这里讲怎么处理这部分的问题&#xff1a; 1&#xff1a;java maven resource 目录下的jar无法被添加到git 2&#xff1a;使用git命令添加jar包时报错&#xff1a;The following paths are ignored by one of your .gitignore files: ***&#xff0c;use -if **** 上面都是相同…

SpringMVC实战:构建高效表述层框架

文章目录 1. SpringMVC简介和体验1.1 介绍1.2 主要作用1.3 核心组件和调用流程1.4 快速体验 2. SpringMVC接收数据2.1 访问路径设置2.2 接收参数2.2.1 param和json参数比较2.2.2 param参数接收2.2.3 路径参数接收2.2.4 json参数接收 2.3 接收cookie数据2.4 接收请求头数据2.5 原…

Spring Boot技术中小企业设备管理系统设计与实践

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

SpringBoot启动报错java.nio.charset.MalformedInputException: Input length =1

启动springboot项目时&#xff0c;出现了以下报错&#xff1a; defaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDjava.lang.IllegalStateException: Failed to load property source from location classpath:/application-local.yamlat o…

行业首发|美格智能创新推出5G+Wi-Fi 7智能终端解决方案,端侧AI助力数智升维

在数字化时代的生产生活过程中&#xff0c;特殊场景下的通信需求愈发重要。高速、灵活、稳定的通信保障能够进一步提升生产生活的效率。随着5G网络的高速发展&#xff0c;一方面&#xff0c;其凭借低时延、高带宽、高可靠性和大规模连接的特性让移动终端的网络连接实现跨越式升…