蓝桥杯刷题|03普及-真题

news2025/2/25 9:29:20

 [蓝桥杯 2017 省 B] k 倍区间

题目描述

给定一个长度为 N 的数列,A_{1}​,A_{2},⋯A_{N},如果其中一段连续的子序列 A_{i}​,A_{i+1},⋯A_{j} (i≤j) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。

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

输入格式

第一行包含两个整数 N 和 K(1≤N,K≤10^{5})。

以下 N 行每行包含一个整数 A_{i}(1≤A_{i}10^{5})。

输出格式

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

输入输出样例

输入 #1

5 2
1  
2  
3  
4  
5  

输出 #1  6

说明/提示

时限 2 秒, 256M。蓝桥杯 2017 年第八届

        对于这个题,先用了暴力枚举来解题,发现只能过两个样例,其他的都超时了,之后看了题解,他们用了前缀和思想,下面我就整理前缀和相关概念和解题方法。

前缀和

前缀和是什么?

通俗理解,前缀和就是任意一个元素前面所有元素的和(包括本身);

例如:这有一个数组arr[3]={1,2,3}

           如果设定一个数组为此数组的前缀和数组perfix[3]={1,3,6}

前缀和的好处

好处就是减少时间复杂度,例如上面的题,要求一段区间的和,用暴力枚举就会超时。使用前缀和,我们只需要用末尾的前缀和减去初位置的前缀和就可以得到该区间的和了;

我们来举个例子吧。定义一个arr[6]={1,2,3,4,5,6},求这个数组的任意一个区间[i,j]的和

暴力枚举

我们肯定会从第一个元素开始,每次往后+1;然后从第二个元素开始,每次往后+1...;

假设要求[i,j]这个区间的和

	for(int t=0;i<t;t++)
        int num1+=arr[t];
	for(int m=j;m<=j;m++)
		int num2+=arr[m];
    int num=num2-num1;

	

前缀和

定义一个 前缀和数组,从头开始求前缀和之后的前缀和就是前一个前缀和加上当前元素

prefix[0]=arr[0];
for(int n=0;n<arr.size;i++)
    prefix[n]=prefix[n-1]+arr[n];
int num=predix[j]-prefix[i-1];

prefix[j]-prefix[i-1]=arr[i]+arr[i+1]+...+arr[j];

因为这个题是一维的,我们就先介绍一维前缀和。

K倍区间解题思路

这个题不仅利用了前缀和还要转换思想,要求K的倍数,也就是是说根据前缀和里面的元素的运算得到的结果,只要没有余数就行,为防止数值溢出,我们可以只给前缀和里面存余数就行,余数如果为0,那么就是k的倍数。

因此这个前缀和数组中存的不是和,而是和的余数。具体操作如下:

prefix[0]=arr[0];
for(int n=0;n<arr.size;i++)
    prefix[n]=(prefix[n-1]+arr[n])/K;

第一步可以直接判断prefix数组里面的值是否0,等于0就是K 的倍数。

第二步就是中间子序列的值是否是K的倍数,令这个子序列的左下标为left,令右下标为right,那么子序列的和可以表示为prefix[right]-prefix[left-1],判断是不是K的倍数就是判断这个子序列的和除于K的余数是否为0。

(prefix[right]-prefix[left-1])%K==0

prefix[right]%K-prefix[left-1]%K==0

prefix[right]%K==prefix[left-1]%K

因此只要判断prefix[right]%K==prefix[left-1]%K就行,换个说法就是要找相同的有几个,假如有a个相同,这些相同的两两组合就可以构成一个子序列,也就是高中学的排列组合,我定义一个cnt数组,里面的数就代表i向同的有几个,然后两两组合,也就是

C_{cnt[i]}^{2}=\frac{cnt[i]*(cnt[i]-1)}{2*1}

最后不要忘了前缀和里面单独余数为0的也是K的倍数,cnt[0]就是余数为0的个数。加上就行。

最后就是注意,记得数据类型定义为long long int

具体代码如下

 #include<iostream>
#include<vector>
using namespace std;
long long int n=1e6+10;
int main()
{
	long long int N,K,num=0,i;
	cin>>N>>K;
	vector <long long int>arr(n);//原数组 
	vector <int>prefix(n);//前缀和数组
	vector <long long int>cnt(n);
	
	for(i=1;i<=N;i++)
	{
		cin>>arr[i];//数组输入
		prefix[i]=(prefix[i-1]+arr[i])%K;//前缀和数组 
		cnt[prefix[i]]++;//统计里面相同的 
		
	}
	
	for(i=0;i<N;i++)
	{
		num+=cnt[i]*(cnt[i]-1)/2;//将相同的进行排列组合 
	}
	cout<<num+cnt[0];//余数为0的本来就是K的倍数 
	return 0;
 } 

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

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

相关文章

微服务高级篇(一):微服务保护+Sentinel

文章目录 一、初识Sentinel1.1 雪崩问题及解决方案1.2 微服务保护技术对比1.3 Sentinel介绍与安装1.4 微服务整合Sentinel 二、Sentinel的流量控制三、Sentinel的隔离与降级四、Sentinel的授权规则五、规则持久化5.1 规则管理模式【原始模式、pull模式、push模式】5.2 实现push…

第二十六节 Java 重写(Override)与重载(Overload)

重写 (Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写&#xff01;返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。…

面试算法-48-二叉树的锯齿形层序遍历

题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,…

从Excel到山海鲸:我的数据可视化升级之旅

作为一名新用户&#xff0c;我最近有幸体验了山海鲸可视化软件&#xff0c;近期山海鲸可视化产品开放了可视化编辑全部功能&#xff0c;并支持本地化部署功能&#xff0c;在使用过程中它不仅打开了我对数据可视化全新世界的大门&#xff0c;而且在实际操作中为我带来了不少惊喜…

【C语言】数据在内存中的存储(包含大小端字节序问题)~

一、前言 我们在刚开始学习C语言的时候&#xff0c;就接触到了很多数据的不同类型。我们也知道&#xff0c;数据是存储在一块内存空间的&#xff0c;且我们只知道数据的类型决定着&#xff0c;该数据在内存中所占内存空间的大小&#xff0c;且超过一个字节的数据在内存中存储的…

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接&#xff1a; Attention Is All You Need 参考文章&#xff1a; 【NLP】《Attention Is All You Need》的阅读笔记 一…

安科瑞智慧安全用电云平台【无人化数据监控 远程控制 运维管理】

背景 在住宅火灾中&#xff0c;电气引发的居高不下&#xff0c;已查明原因的火灾中有52%系电气原因引起&#xff0c;尤其是各类家用电器、电动车、电气线路等引发的火灾越来越突出&#xff0c;仅电动自行车引发的较大火灾就有7起。这些事故暴露出电器产品生产质量、流通销售&a…

引领展览新风尚:一站式搭建VR在线展馆,开启数字化展示新纪元

随着VR技术的不断成熟和普及&#xff0c;VR在线展馆已成为企业和用户展示展品的新颖方式。这种技术不仅能够提供沉浸式的观展体验&#xff0c;还能帮助企业和个人快速搭建属于自己的虚拟展馆。元居虚拟空间布展平台为用户提供了快速搭建VR在线展馆的便捷服务。 一、VR在线展馆的…

vue3+vite项目打包遇到的问题

一、项目打包出现空白页 vite.config.js中&#xff0c;添加base: ./ import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({base: ./, })router/index.js&#xff0c;将路由模式改成hash模式 import { createRouter, createWe…

4G/5G视频记录仪_联发科MTK6765平台智能记录仪方案

视频记录仪主板采用了联发科MT6765芯片&#xff0c;该芯片采用12nm FinFET制程工艺&#xff0c;8*Cortex-A53架构&#xff0c;搭载安卓11.0/13.0系统&#xff0c;主频最高达2.3GHz&#xff0c;待机功耗可低至5ma&#xff0c;并具有快速数据传输能力。配备了2.4英寸高清触摸显示…

YOLOv5独家改进:block改进 | RepViTBlock和C3进行结合实现二次创新 | CVPR2024清华RepViT

💡💡💡本文独家改进:CVPR2024 清华提出RepViT:轻量级新主干!从ViT角度重新审视移动CNN,RepViTBlock和C3进行结合实现二次创新 改进结构图如下: 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创…

2024:存量时代,内容平台如何“发新芽”?

今年年初&#xff0c;腾讯董事会主席马化腾表示&#xff0c;微信这棵老树如何发新芽&#xff0c;是一个很大的问题。 在互联网存量时代&#xff0c;如何提升效率焕发新活力&#xff0c;已经成为内容平台共同的命题。本质上看&#xff0c;这需要平台把握“三重法则”&#xff1…

【STM32+HAL】DMA应用

一、串口DMA收发 1、串口初始化 2、定义全局变量 #define RXBUFFERSIZE 256uint8_t rx_buffer[RXBUFFERSIZE];//接收数组 volatile uint8_t rx_len 0; //接收到的数据长度 volatile uint8_t recv_end_flag 0; //接收结束标志位 3、开启IDLE中断以及串口DMA接收 /* USER COD…

numpy的数组深度叠加dstack详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 numpy的dstack函数用于沿着第三个维度&#xff08;深度&#xff09;将数组堆叠起来。它将多个数组按照深度方向进行堆叠&#xff0c;生成一个新的数组。具体来说&#xff0c;dstack函数会将输入的…

【网络原理】HTTP协议和使用Fiddler抓包

文章目录 &#x1f343;HTTP协议是什么&#xff1f;&#x1f340;理解 "应用层协议"&#x1f38d;HTTP 协议的工作过程&#x1f334;HTTP 协议格式&#x1f333;Fiddler抓包工具的使用&#x1f338;如何抓HTTPS的包&#xff1f; &#x1f38b;抓包工具的原理&#x1…

直观与交互:山海鲸可视化软件与Excel传统表格的对比

作为一名长期使用Excel进行数据处理和分析的用户&#xff0c;最近我尝试了一款名为山海鲸的可视化软件&#xff0c;发现它与Excel传统表格之间存在诸多明显的差异。接下来&#xff0c;我将从个人体验视角出发&#xff0c;谈谈这两种工具的不同之处。 首先&#xff0c;从数据呈…

HashMap设置初始容量为17,那么它的实际容量是多少?

典型回答 即使初始化 HashMap 的容量为 17&#xff0c;那么它的实际容量却是 32。 这是因为 HashMap 的容量只能为 2 的 N次方&#xff0c;这是 HashMap 的源代码中的实现&#xff0c;无论用户输入的是多少&#xff0c;它总会通过计算&#xff0c;得到第一个比他大的2的N 次方…

cc-uploadSomePic图片上传组件:快速开发与用户体验的提升

cc-uploadSomePic图片上传组件&#xff1a;快速开发与用户体验的提升 摘要&#xff1a; 在前端开发中&#xff0c;图片上传功能是一个常见的需求。为了提高开发效率和用户体验&#xff0c;我们开发了一个名为cc-uploadSomePic的图片上传组件。该组件支持单个或多个文件上传&am…

Linux下使用ntpdate进行时间同步

1.简介 ntpdate是Linux下用于从NTP服务器同步时间的命令行工具。 2.安装 大多数Linux发行版已预装ntpdate。未安装的可使用以下命令&#xff1a; # Ubuntu/Debian sudo apt-get install ntpdate # CentOS/Fedora/RHEL sudo yum install ntpdate 3.手工同步网络时间 执行以下命…

JavaScript中的继承方式详细解析

什么是继承 继承是面向对象编程中的一个重要概念&#xff0c;它指的是一个对象&#xff08;或类&#xff09;可以获得另一个对象&#xff08;或类&#xff09;的属性和方法。在继承中&#xff0c;被继承的对象通常称为父类&#xff08;或基类、超类&#xff09;&#xff0c;继…