C++实现 蓝桥杯 k倍区间

该博客介绍了如何使用C++解决蓝桥杯算法竞赛中的k倍区间问题。通过利用前缀和和模运算性质,将数组分为余数为1和0的两种情况,计算连续区间和为k的倍数的区间数量。在遍历过程中,当遇到余数为1的元素时,增加的k倍区间个数为之前余数为1的前缀和的个数;余数为0时,增加的k倍区间个数为余数为0的前缀和的个数。最后,别忘了加上余数为0的前缀和本身作为k倍区间。
摘要由CSDN通过智能技术生成

这里是题目链接
k倍区间

题目大意
简单来说,给你一个数组和一个数k,让你满足数组中连续区间和为k的倍数的区间有几个

思路
看到题目的连续区间的时候,就知道这题使用前缀和来写的,然后我喜闻乐见的TLE了 ,咳咳,看了题目100000组数据,那n2数据妥妥的过不了了,只能是看看怎么画了,于是想到一个定理,(A-B)mod k= A mod k - B mod k这样就有思路了

为了说明方便,我们设这个数组有{1,2,3,4,5},k为2

首先,对于数组num, 我们算出它的各个前缀和的余数,然后依此遍历,设一个计数的数组cnt[i]表示余数为 i 的个数,这样,遍历过程中,有两种情况

1.当前元素余数为1,则此时,由上面的(A-B)mod k =A mod k -B mod k可知,增加的k倍区间个数为cnt[1]的值.简单来说,cnt[1]为之前找到余数为1的前缀和的个数,如果cnt[1]>0,那么前面至少有一个余数为1的前缀和,和一个余数为1的当前的前缀和序列,则这两个序列之间的余数差为0,则意味着两个余数为1的前缀和,他们之间的区间就是k倍区间,所以当增加的k倍区间个数有cnt[1]个

2.当前元素余数为0的情况差不多,增加的k倍区间个数为cnt[0]个

注意到了最后,我们还要格外给答案加上cnt[0]的值,因为余数为0的前缀和本身也是一个k倍区间呀!

那么剩下的代码问题就很简单了

#include <iostream>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值