K倍区间(蓝桥杯)

文章目录

  • K倍区间
    • 题目描述
    • 前缀和+数学优化
      • 代码部分解释

K倍区间

题目描述

给定一个长度为 N的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K的倍数,我们就称这个区间 [i,j]是 K倍区间。

你能求出数列中总共有多少个 K倍区间吗?

输入格式
第一行包含两个整数 N和 K。

以下 N行每行包含一个整数 Ai。

输出格式
输出一个整数,代表 K倍区间的数目。

数据范围
1≤N,K≤100000,
1≤Ai≤100000

输入样例:

5 2
1
2
3
4
5

输出样例:

6

前缀和+数学优化

#include<bits/stdc++.h> // 包含所有标准库
using namespace std;

const int z=1e5+10; // 定义常量z作为数组大小的上限

long long a[z],s[z],cnt[z]; // 定义三个数组,a存储输入的数列,s存储前缀和,cnt用于记录各个模数出现的次数

int main()
{
    int n,k; // n代表数列的长度,k代表区间和的倍数
    scanf("%d%d",&n,&k); // 读入n和k
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]); // 读入数列的每个数
        s[i]=s[i-1]+a[i]; // 计算前缀和,s[i]表示数列前i个数的和
    }
    long long res=0; // 存储最终结果,即总的K倍区间数目
    cnt[0]=1; // 初始化cnt数组,cnt数组用来记录各个模k的值的出现次数,其中cnt[0]初始化为1表示和为0的情况
    for(int r=1;r<=n;r++)
    {
        res+=cnt[s[r]%k]; // 对于每个r,累加s[r]模k后相同余数的次数,这代表之前有多少个前缀和与当前的s[r]模k得到相同结果
        cnt[s[r]%k]++; // 更新当前余数出现的次数
    }
    printf("%lld",res); // 输出结果
    return 0; // 程序结束
}

在这个代码中,s[r] % k的含义是计算前缀和s[r]模上k的余数。当两个前缀和模k的余数相等时,它们之间的区间和是k的倍数。因此,通过记录和计算每个模k余数的出现次数,我们可以确定有多少个这样的子序列满足条件。

例如,如果s[i] % k == s[j] % ki < j,那么(s[j] - s[i]) % k == 0,也就是说子序列[i + 1, j]的和是k的倍数。cnt[s[r]%k]就是用来记录到当前位置为止,模k余数相同的前缀和数量。res变量用来累加每次新增的K倍区间数量。

这是一个非常典型的利用余数性质和前缀和技巧来解决子区间问题的示例。通过这种方法,我们可以将原本可能需要O(N^2)时间复杂度的问题优化到O(N)。

代码部分解释

long long res=0; // 存储最终结果,即总的K倍区间数目
    cnt[0]=1; // 初始化cnt数组,cnt数组用来记录各个模k的值的出现次数,其中cnt[0]初始化为1表示和为0的情况
    for(int r=1;r<=n;r++)
    {
        res+=cnt[s[r]%k]; // 对于每个r,累加s[r]模k后相同余数的次数,这代表之前有多少个前缀和与当前的s[r]模k得到相同结果
        cnt[s[r]%k]++; // 更新当前余数出现的次数
    }

当然,让我更详细地解释这个过程:

在这个问题中,我们要计算子序列和为K的倍数的区间数量。为了高效计算,我们使用了前缀和数组s,以及一个计数数组cnt

前缀和s[i]表示第一个元素A[1]到当前元素A[i]的总和。前缀和的有用之处在于,它允许我们快速计算任何子序列A[i...j]的和为s[j] - s[i-1]

接着,我们使用模运算来帮助我们找到K的倍数。对于任意整数x,如果x % K == 0,那么x是K的倍数。对于两个数x和y,如果它们除以K的余数相同,那么x - y是K的倍数。我们利用这个性质来找到我们的K倍区间。

在程序中,变量res用于累计找到的K倍区间的总数。数组cnt用于存储对于前缀和数组s中每个元素取模K后得到的余数的出现次数。

cnt[0] = 1;的目的是为了处理那些从A[1]开始的前缀和本身就是K的倍数的情况。因为前缀和数组是从下标1开始的,所以在没有任何元素的情况下,我们可以认为有一个和为0的前缀和(也就是说,我们从数组的开始处就有一个零长度的前缀和)。

在主循环中,对于每个下标r(从1到n),我们做两件事:

  1. res += cnt[s[r] % k];
    这一行是计算结果的核心。我们取当前前缀和s[r]除以K的余数,然后在cnt数组中查找这个余数之前出现了多少次。这个余数之前出现的次数,即表示有多少个之前的前缀和与s[r]除以K的余数相同。由于之前的前缀和与当前的s[r]有相同的余数,这意味着从那个前缀和的下一个位置到当前位置r的子序列和是K的倍数。所以,我们将这个数量加到res上。

  2. cnt[s[r] % k]++;
    这一行更新计数数组。我们增加当前余数的出现次数,因为我们刚刚考虑了一个新的前缀和s[r]

通过这种方式,我们可以在遍历数组的同时,累计找到的K倍区间的数量。这种方法是非常高效的,因为它只需要一次遍历(O(N)时间复杂度),而不是对每个可能的子序列都进行检查(这将需要O(N^2)时间复杂度)。

在这里插入图片描述

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

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

相关文章

Zabbix(四)

Zabbix Proxy zabbix作为一个分布式监控系统(分布式监控解决方案)&#xff0c;支持通过代理(proxy)收集zabbix agent的监控数据&#xff0c;然后由zabbix proxy再把数据发送给zabbix server&#xff0c;也就是zabbix proxy 可以代替zabbix server收集监控数据&#xff0c;然后…

Mybatis-Spring | Mybatis与Spring的“整合“

目录 : 一、配置环境1. 整合环境需导入的JAR :Spring框架所需JARMybatis框架所需JARMyBatis与Spring整合的中间JAR数据库驱动JAR包数据源所需JAR包 &#xff08;下面的例子中 : 用的不是这个数据源&#xff09; 2. 编写“配置文件” 和 “.properties文件” ( 只是概述&#xf…

电磁铁通电后测不到磁场是什么原因

电磁铁 电磁铁没有磁力的一般原因有多种&#xff0c;以下是一些常见原因&#xff1a; 1. 电源问题&#xff1a;电磁铁没有连接好电源或电源电压不足&#xff0c;无法产生足够强的磁场。电磁铁所需要的电流和电压应符合制造商的规定。另外的话&#xff0c;电源接头也需要注意接…

SAP 消息编号 M8147

月末执行物料分类账的时候&#xff0c;出现以下报错 解决方法&#xff1a;OBYC-PRM

Linux运维:实现光盘开机自动挂载、配置本地yum源教程

Linux运维&#xff1a;实现光盘开机自动挂载、配置本地yum源教程 一、光盘开机自动挂载1、检查光驱设备2、创建挂载点3、编辑/etc/fstab文件4、测试挂载 二、配置本地yum源(挂载光盘或ISO文件)1、挂载ISO文件2、创建YUM仓库配置文件3、清理YUM缓存并测试 &#x1f496;The Begi…

萌新小白对于ctf学习的笔记--CTF中的RCE

概念 RCE(Remote code execution&#xff09;远程代码执行漏洞&#xff0c;RCE又分命令执行和代码执行。 RCE-远程代码执行&#xff1a;远程执行PHP代码RCE-远程命令执行&#xff1a;远程执行Linux或者Windows等系统命令。 常见函数有&#xff1a; PHP&#xff1a;eval(),a…

解决syslog服务器启动问题

Syslog 监控和管理对于每个组织来说都很重要&#xff0c;可以减少系统停机时间、提高网络性能并加强企业的安全策略。而在网络系统管理中&#xff0c;syslog服务用于收集、存储和管理系统和设备的日志信息。 然而&#xff0c;有时候我们可能会遇到syslog服务器无法启动的问题&…

mysql中 COALESCE和CASE WHEN的使用以及创建或替换视图

create or replace view 自理能力评估视图 as SELECT ehr_zlnlpg.ID AS ID, ehr_zlnlpg.GRID AS GRID, ehr_zlnlpg.TJID AS TJID, ehr_grjbxx.Name AS 姓名, ehr_grjbxx.Sex AS 性别, ehr_grjbxx.Cardnum AS 身份证号, ehr_zlnlpg.SCORESUM AS 总…

[每周一更]-第90期:认识Intel的CPU

市面上的CPU分类主要分有两大阵营&#xff0c;一个是Intel、AMD为首的复杂指令集CPU&#xff0c;另一个是以IBM、ARM为首的精简指令集CPU。 两个不同品牌的CPU&#xff0c;其产品的架构也不相同&#xff0c;例如&#xff0c;Intel、AMD的CPU是X86架构的&#xff0c;而IBM公司的…

基于java+springboot+vue实现的校园悬赏任务平台(文末源码+Lw)23-277

摘 要 使用旧方法对校园悬赏任务平台的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在校园悬赏任务平台的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的…

STM32 | Proteus 8.6安装步骤(图文并茂)

01 Proteus 8.6 简介 Proteus 8.6 是一款功能强大的电子设计自动化软件&#xff0c;广泛用于电路设计、仿真和PCB布局。它为电子工程师和学生提供了一个全面的工具集&#xff0c;用于设计和验证各种电路和电子设备。Proteus 8.6 包括了以下几个主要特性&#xff1a; 1. 电路设…

云计算 3月8号 (WEB服务及Apache 服务的搭建与配置——基于域名 端口 Ip多方式访问)

1、WEB服务简介 # 目前最主流的三个Web服务器是Apache、Nginx、 IIS。 - WEB服务器一般指网站服务器&#xff0c;可以向浏览器等Web客户端提供网站的访问&#xff0c;让全世界浏览。 - WEB服务器也称为WWW(WORLD WIDE WEB)服务器&#xff0c;主要功能是提供网上信息浏览服务。 …

【lua】lua内存优化记录

这边有一个Unity项目用的tolua&#xff0c; 游戏运行后手机上lua内存占用 基本要到 189M&#xff0c; 之前峰值有200多。 优化点1 加快gc频度&#xff1a; 用uwa抓取的lua内存&#xff0c; 和unity的mono很像&#xff0c;内存会先涨 然后突然gc一下&#xff0c;降下来。 这样…

S4---FPGA-K7板级原理图硬件实战

视频链接 FPGA-K7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-K7板级原理图硬件实战 基于XC7K325TFFG900的FPGA硬件实战框图 基于XILINX 的KINTEX-7 芯片XC7K325FPGA的硬件平台&#xff0c;FPGA 开发板挂载了4 片512MB 的高速DDR3 SDRAM 芯片&#xff0c;另外板上带有一个SODIM…

RabbitMQ的Windows版安装教程

文章目录 前言一、Windows安装RabbitMQ总结 前言 曾经写过一篇关于RabbitMQ的Ubuntu安装教程&#xff08;http://t.csdnimg.cn/5CYfC&#xff09;&#xff0c;当时使用的是Docker将RabbitMQ安装到虚拟机上&#xff0c;但是有很多小伙伴问Windows上如何进行安装RabbitMQ&#x…

根据xlsx文件第一列的网址爬虫

seleniumXpath 在与该ipynb文件同文件下新增一个111.xlsx&#xff0c;第一列放一堆需要爬虫的同样式网页 然后使用seleniumXpath爬虫 from selenium import webdriver from selenium.webdriver.common.by import By import openpyxl import timedef crawl_data(driver, url)…

【力扣白嫖日记】1164.指定日期的产品价格

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1164.指定日期的铲平价格 表&#xff1a;Products 列名类型product_idintnew_priceintchange_datedate (pr…

Nacos2.2.3之MySQL8.X持久化详细配置过程

Nacos2.2.3之MySQL8.X持久化详细配置过程 文章目录 Nacos2.2.3之MySQL8.X持久化详细配置过程1. 官网与下载1. 官网2. Naocs是什么&#xff1f;3. 下载 2. 安装与持久化配置1. 解压安装2. 创建数据库1. 连接数据库2. 创建nacos数据库3. 导入脚本4. 查看表 3. 持久化配置1. appli…

Ant Design Vue a-select 的 optionFilterProp 检索结果不对

<a-selectshow-search //可输入查询optionFilterProp"label" //查询的是labelv-model:value"form.roomId"placeholder"请选择房间名称":disabled"isUpdate"><a-select-optionv-for"item in rooms":key"ite…

【嵌入式高级C语言】9:万能型链表懒人手册

文章目录 序言单向不循环链表拼图框架搭建 - Necessary功能拼图块1 创建链表头信息结构体 - Necessary2 链表头部插入 - Optional3 链表的遍历 - Optional4 链表的销毁 - Necessary5 链表头信息结构体销毁 - Necessary6 获取链表中节点的个数 - Optional7 链表尾部插入 - Optio…
最新文章