前缀和求解k倍区间问题

2023-10-31

题目描述:给定一个长度为 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

 一般的暴力解法:

1.利用前缀和公式求解出s[1],s[2],s[3]....s[n];

for(int i=1;i<=n;i++){
    cin>>s[i];
    s[i]+=s[i-1];
}

2.两层for循环遍历每一段区间[i,j]

for(int i=1;i<=n;i++){
    for(int j=i;j<=n;j++){
        int area=s[j]-s[i-1];//计算一段区间的和
        if((area%k)==0) res++;//记录最终答案
    }
}

很明显,作为蓝桥杯的题目不会这么容易被暴力破解,最终会超时

接下来我们先引入一段知识,假设s[i]是k的倍数,且s[j]是k的倍数,(i<j)那么s[j]-s[i]也是k的倍数且有以下公式:(s[j]-s[i])%k==0 =>> s[j],s[i]同余

也就是说,在 j 之前的 0 ~ j -1当中,只要有 i 满足s[j] ,s[i] 同余,那么s[j]-s[i]所代表的区间就是k倍区间,然后我们就只需要用cnt[N]记录数组记录j之前满足同余条件的i个数,就可以知晓在【1,j】区间当中可以产生多少k倍区间

#include<iostream>
using namespace std;
const int N =1e5+7;
int cnt[N];

typedef long long LL;
LL s[N],res;

int main(){
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        s[i]+=s[i-1];
    }//预处理前缀和数组
    cnt[0]=1;

//这里要注意边界问题,例如s[i]%k==0 且 s[j]%k==0 ,假设在j之前只有i满足

//s[i]%k==0,那么cnt[0]=1,只能产生1个区间就是s【i,j],但实际上是s[1,i],s[1,j],s[i,j],

//为了避免忽略情况,要对边界处理

    for(int i=1;i<=n;i++){
        res+=cnt[s[i]%k];
        cnt[s[i]%k]++;
    }
    cout<<res;
}

制作不易,客官点个赞再走啦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前缀和求解k倍区间问题 的相关文章

随机推荐

  • C++STL详解(十一)-- 位图(bitset)

    文章目录 位图的介绍 位图的引入 位图的概念 位图的应用 位图的使用 位图的定义 位图的成员函数 位图运算符的使用 位图的模拟实现 成员函数 构造函数 set reset test flip size count none any all
  • [Android]多进程知识点详解

    作者 Android开发 Hua 链接 https www jianshu com p e0f833151f66 多进程知识点汇总 一 了解多进程 二 项目中多进程的实现 三 多进程的优缺点与使用场景 四 Android跨进程通讯实现 五
  • 晨读-为什么人会越活越沉默?

    有很多人都有一种可以称之为 被动沉默 的困扰 在社交场合中一开始说话 就会容易陷入紧张焦虑 在意周围的目光 明明心里有很多的想法和意见 但就是在关键时刻脑子一片空白 表达不出来或者不敢表达 特别渴望与人交流 也知道与人交流是好事情 但就是无
  • 深入解析 ObjC 中方法的结构

    因为 ObjC 的 runtime 只能在 Mac OS 下才能编译 所以文章中的代码都是在 Mac OS 也就是 x86 64 架构下运行的 对于在 arm64 中运行的代码会特别说明 在上一篇分析 isa 的文章从 NSObject 的
  • vue页面跳转的两种方式

    js方法跳转 changePages this router push path two html vue标签跳转
  • python中英文混合字符串宽度对齐打印

    中英文宽度对齐 def print format string way width fill ed 格式输出函数 默认格式填充用单空格 不换行 try count 0 长宽度中文字符数量 for word in string 检测长宽度中文
  • 给电子信息工程大学生的一些忠告

    漫漫长路 首先恭喜各位能够进入电子行业 只是这个行业感觉还是有前途的 不过在好的条件还要看自己努力不 好的开端是成功的一半 如果各位真的是想毕业以后做与自己行业有关的工作 那就听我慢慢的到来 如果是毕业不想做与自己专业有关的工作 那我下面要
  • 美国科学家提出AGI概念,将在未来取代AI人工智能!

    人工智能学科的核心是有一天我们能够建造一个像人类一样聪明的机器 这种系统通常被称为人工通用智能系统 即AGI 它是将概念与更广泛的研究领域区分开来的名称 它还清楚地表明 真正的人工智能拥有广泛且适应性强的智能 到目前为止 我们已经建立了无数
  • class类python_python入门(七)class类

    类 是面向对象一个载体 类的定义 class A object pass 全局变量 函数1 def self 函数2 def 类里面有很多函数 函数第一个参数默认都是self 变量可以直接在类的内部直接定义 类在内部调用函数或者变量的时候
  • 我工作中踩过的坑--服务器管理篇

    也许有人会问 束测搞好束测的事就好了 干嘛还自己搞服务器后台啥的 貌似以前有个文解释了的 竟然一时找不到 就再啰嗦一下 束测有众多子系统 各种采集 摄像头 示波器 万用表 电机控制 各种专用处理器 以前一般都是众多的工控机直接去连设备跑起程
  • 用R制作gif动态图以及从gif中提取图片

    作者 辉小宝同学 微信公众号 R语言和Python学堂 知乎 https www zhihu com people zoro 3 92 posts 简书 https www jianshu com u 981ba7d6b4a6 熟悉R的朋友
  • Android 短时间内多次启动同一个Service会不会有多次的binder调用

    背景 笔者刚接触公司的新项目 发现项目中有些场景居然在短时间内 几十毫秒内 发送同一个Service 本来功能没有什么大问题 但是笔者有点怀疑 短时间内发送多个相同的Service会不会影响性能 因为启动服务涉及到binder通信 ANR问
  • 语义分割图像增强新方法

    最近在日常挖坑中发现了另一种简单有效数据扩充方法 将其分享使用 之前都是利用opencv自己编写代码进行图像的翻转 旋转角度 裁剪 亮度变化等等操作 对于语义分割任务来说 一种有效的提升性能的办法就是对现有数据进行增强 扩充现有数据的多样性
  • 查询postgresql死锁数量

    每个数据库的死锁数量都存在postgresql自身维护的 pg stat database 表中 查询postgres死锁数量 select deadlocks from pg stat database
  • webpack5打包vue项目

    目录 写在前面 webpack四大核心 entry 入口 loader 加载器 plugin 插件 output 出口 webpack打包vue项目 初始化项目 vue loader webpack dev server 配置开发服务器 加
  • 微信小程序开发【知识点大全】

    微信小程序开发重点 知识点 token appid openid AppSecret 快捷键 知识点 token 有些接口是可以公开访问的 有些是不允许公开访问的 所以要设置token进行区分验证 token机制 客户端获取一个code 通
  • 创建私有仓库时,重启docker服务报错

    报错信息 Unit docker service has begun starting up 3月 23 22 53 52 docker dockerd 82851 unable to configure the Docker daemon
  • 微信小程序-防止多次点击跳转的问题(实战项目亲测有效)

    微信小程序 防止多次点击跳转的问题 最近多个小程序项目遇到一个头大的问题 就是点击事件多次点击会造成多次重复跳转或多次请求的情况 网上看了一下论坛一大堆方法 试了几个都是不行 最后看了一下小程序的文档 发现遗忘了很实用了触控事件bindto
  • 想在网上兼职做什么比较好,分享五个网上兼的副业项目帮你拓展视野

    许多工薪族都想要运用下班了的空余时间根据网上做兼职 却却找不到人正确引导一条正确的方向 并没有渠道信息内容 那他们如何找到自已的做兼职呢 小编觉得应当在网络上多查看的相关资料 多探寻方式 选择适合自己的做兼职 随后用心去感受干 慢慢地 便会
  • 前缀和求解k倍区间问题

    题目描述 给定一个长度为 N的数列 A1 A2 AN 如果其中一段连续的子序列Ai Ai 1 Aj之和是 K 的倍数 我们就称这个区间 i j 是 K倍区间 你能求出数列中总共有多少个 K倍区间吗 输入格式 第一行包含两个整数 N和 K 以