2024/3/14打卡k倍区间(8届蓝桥杯)——前缀和+优化***

news/2024/4/29 3:29:03

题目

给定一个长度为 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

思路

第一种O(n^3) 暴力枚举

for(int i=1;i<=n;i++){ // 从1枚举到n for(int j=1;j<=i;j++){ // 从1枚举到ifor(int k=j;k<=i;k++) // 计算i~j的和sum += a[k]if(sum%k==0) res++; }
}

第二种O(n^2) 使用前缀和(仍然过不了,甚至过的点是跟暴力一样的)

前缀和(一维+二维)-CSDN博客 

for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){if((s[i]-s[j-1])%k==0) res++;}
}

第三种O(N) 在前缀和基础上优化

        在第二种方法的第二层循环里面 ,目的是判断  (s[i]-s[j-1])\%k=0 ,即 s[i]\%k=s[j-1]\%k判断两个余数是否相等如果在第 i 层循环里面,我们可以知道从 0 到 i-1 中有 哪些的前缀和\%k 等于 s[i]\%k ,那么这一段就是K倍区间。

        新开一个数组 cnt[ ] ,存储前 i 个值的余数情况。

cnt[0] = 1; // 如果某个数自身也可以整除k,说明取余为0,所以cnt[0]初始化为1,
for(int i=1;i<=n;i++){int t = s[i]%k; // i个值的前缀和对k取余res += cnt[t]; // 加上前 0~i-1 有相同的余数的个数cnt[t]++; // 第i个前缀和取余k的余数对应的cnt++
}

完整代码

import java.io.*;class Main{static int N = 100010;static int n,k;static int[] cnt = new int[N];static long res;static long[] s = new long[N];public static void main(String[] args) throws IOException{BufferedReader in = new BufferedReader(new InputStreamReader(System.in));String[] str = in.readLine().split(" ");n = Integer.parseInt(str[0]);k = Integer.parseInt(str[1]);for(int i=1;i<=n;i++){ // 求前缀和s[i] = s[i-1]+Integer.parseInt(in.readLine());}cnt[0] = 1;for(int i=1;i<=n;i++){long t = s[i]%k;res += cnt[(int)t];cnt[(int)t]++;}System.out.println(res);}
}

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

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

相关文章

适用于系统版本:CentOS 6/7/8的基线安全检测脚本

#!/bin/bash #适用于系统版本&#xff1a;CentOS 6/7/8 echo "----------------检测是否符合密码复杂度要求----------------" #把minlen&#xff08;密码最小长度&#xff09;设置为8-32位&#xff0c;把minclass&#xff08;至少包含小写字母、大写字母、数字、特殊…

PWM驱动直流电机

接线图项目结构 PWM.C #include "stm32f10x.h" // Device headervoid PWM_Init(void){// 开启时钟&#xff0c;这里TIM2是通用寄存器RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// GPIO初始化代码/*开启时钟*/RCC_APB2PeriphClockCmd(R…

下载chromedrive,使用自动化

1、先看一下自己浏览器的版本 2、访问 https://googlechromelabs.github.io/chrome-for-testing/

外包干了9天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2018年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

【Unity】程序创建Mesh(二)MeshRenderer、光照、Probes探针、UV信息、法线信息

文章目录 接上文MeshRenderer&#xff08;网格渲染器&#xff09;Materials&#xff08;材质&#xff09;Material和Mesh对应Lighting光照Lightmapping材质中的光照 光源类型阴影全局光照Probes&#xff08;探针&#xff09;Ray Tracing&#xff08;光线追踪&#xff09;Additi…

mysql与redis数据测试

题目要求 1.新建一张user表&#xff0c;在表内插入10000条数据。 2.①通过jdbc查询这10000条数据&#xff0c;记录查询时间。 ②通过redis查询这10000条数据&#xff0c;记录查询时间。 3.再次查询这一万条数据&#xff0c;要求根据年龄进行排序&#xff0c;mysql和redis各实现…