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和kfor(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.mzph.cn/news/730175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海雷卯可以解决YPbPr/ YCbCr接口 ESD/EOS静电浪涌问题

YPbPr /YCbCr 接口传输的是视频信号&#xff0c;不传输音频信号。YPbPr 和 YCbCr 都是视频信号的颜色编码格式&#xff0c;多应用于机顶盒&#xff08;Set-top box&#xff09;,TV电视&#xff0c;投影仪&#xff0c;游戏机和DVD播放器。 YPbPr&#xff1a;是一种模拟视频接口…

05-调用API

上一篇&#xff1a; 04-JNI函数 调用 API 允许软件供应商将 Java VM 加载到任意本地应用程序中。供应商可以提供支持 Java 的应用程序&#xff0c;而无需链接 Java VM 源代码。 5.1 概述 下面的代码示例说明了如何使用调用 API 中的函数。在这个示例中&#xff0c;C 代码创建了…

Discuz论坛网站报错Discuz!Database Error(0)notconnect的解决办法

运营服务器大本营有段时间了&#xff0c;在运营期间遇到两次Discuz&#xff01;Database Error&#xff08;0&#xff09;notconnect报错&#xff0c;和你们分享遇到Discuz报错的解决办法&#xff0c;希望可以帮助到你。 首先网站报错&#xff08;0&#xff09;notconnect&…

【Web】浅聊Java反序列化之C3P0——JNDI注入利用

目录 简介 原理分析 EXP 前文&#xff1a;【Web】浅聊Java反序列化之C3P0——URLClassLoader利用 【Web】浅聊Java反序列化之C3P0——不出网Hex字节码加载利用 简介 出网的情况下&#xff0c;这个C3P0的Gadget可以和fastjson&#xff0c;Snake YAML , JYAML,Yamlbeans , …

如何防御udp攻击

UDP Flood是互联网上最经典的DDoS&#xff08;Distributed Denial of Service&#xff09;攻击之一。攻击者在短时间内向目标设备发送大量的UDP报文&#xff0c;导致链路拥塞甚至网络瘫痪。一般的UDP报文由攻击工具伪造&#xff0c;通常在数据段具备相同的特征&#xff0c;另一…

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

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

网站开发之旅:从概念到实现

在我成为一名专业的网站开发者的过程中&#xff0c;我有幸参与了多个激动人心的项目。其中&#xff0c;一个我印象尤为深刻的经历是&#xff0c;开发一个名为“文案推荐网”的主题网站&#xff08;www.zimeiti.love&#xff09;。这个项目不仅让我深入了解了网站开发的各个方面…

excel常用操作备忘

目录 快捷键基础数据透视图统计某列的值出现的频数 数据有效性数据分列运算符顺序文本匹配中的通配符错误的类型&#xff08;常与IF嵌套使用&#xff09;函数RANK(num, ref, [order])MID(str, start, len)逻辑函数混合函数选取整列AVERAGEIF(range, criteria, average_range)TR…

mvp矩阵变换及世界坐标到屏幕坐标的实现

MVP矩阵是一种用于将对象的局部坐标(Model)转换到裁剪空间(Clip Space)的变换矩阵。MVP代表了Model-View-Projection,是由三个矩阵的组合构成的。 Model矩阵(M):模型变换用于将对象的局部坐标(模型空间或对象空间)转换到世界坐标系中。Model矩阵包括了平移、旋转、缩…

【软件测试面试】银行项目测试面试题+答案(一)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

Unity类银河恶魔城学习记录9-2 P83 Explosive crystal源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Crystal_Skill_Controller using System.Collections; using System.Colle…

【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用

目录 一、Linux编译器-gcc/g1.1 gcc/g 使用方法1.2 程序的翻译过程1.3 链接 -- 动静态链接特点及区别 二、Linux调试器-gdb2.1 背景2.2 使用方法 三、Linux项目自动化构建工具-make/Makefile3.1 背景3.2 原理3.3 项目清理 一、Linux编译器-gcc/g 1.1 gcc/g 使用方法 格式&…

如何在Windows系统部署Jellyfin Server并实现公网访问内网影音文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

本地yum源的配置

①在根目录下&#xff0c;执行"mkdir /iso"创建本地yum源文件夹 ②使用SSH工具&#xff0c;将操作系统iso文件上传到iso目录下 ③mount /iso/xxx.iso /mnt ④cd /mnt ⑤cp -arp * /iso ⑥umount /mnt ⑦cd /etc/yum.repos.d ⑧mv *.repo *.repo.bak 把…

用BIO实现tomcat

一、前言 本课程的难度较高&#xff0c;需要将Servlet原理和IO课程全部学完。 二、当前项目使用方式 (1).自定义servlet 自定义servlet需要实现WebServlet并且实现name和urlMapping 重启进行访问 http://localhost:8090/myServlet (2).自定义html 重启进行访问 http://loc…

项目的搭建与配置

vue create calendar_pro 选择如下配置选项 安装 vue3 支持 vue add vue-next package.json 关闭 eslint 检测。 vue.config.js 配置跨域同源策略。 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServe…

VSCode无法用ctrl+鼠标滚轮调整字体大小了

VSCode (Visual Studio Code) 中使用 Ctrl 鼠标滚轮来调整字体大小的功能通常是由 VSCode 的设置控制的。如果你发现这个功能不再工作&#xff0c;你可以尝试以下几个步骤来恢复或检查这个设置&#xff1a; 检查是否有冲突的快捷键或扩展&#xff1a; 打开 VSCode 的快捷键编辑…

微服务:Docker篇

1. 初识Docker 1.1. 什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署&#xff0c;环境不一定一…

Windows上使用client-go远程访问安装在本地WMware上的Linux虚拟机里的minikube

我在自己的Windows上安装了WMware&#xff0c;并在WMware上安装了CentOS操作系统&#xff0c;然后在CentOS上创建了一个叫minikube的用户&#xff0c;使用minikube用户启动了一个minikube集群&#xff0c;但是我在Windows上使用client-go并无法连通minikube&#xff0c;搜遍全网…

【计网】TCP协议安全与风险:深入探讨网络通信的基石

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 &#x1f310;前言 &#x1f512;正文 TCP (Transmission Control Protocol): UDP (User Datagram Protocol): HTTP (Hypertext Transfer …