k倍区间

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。

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

输入格式
第一行包含两个整数 N 和 K。

以下 N 行每行包含一个整数 Ai

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

数据范围
1 ≤ N , K ≤ 100000 , 1≤N,K≤100000, 1≤N,K≤100000,
1 ≤ A i ≤ 100000 1≤Ai≤100000 1≤Ai≤100000

输入样例:

5 2
1
2
3
4
5

输出样例:

6

2.基本思想

1.暴力枚举 时间超时,考虑优化!

2.前缀和 优化到n方不够,考虑继续优化!

3.前缀和+数学

分析:
求区间[l,r]的和是k的倍数的个数。求区间和,我们可以通过前缀和来求出。我们规定s[i]表示第1个元素到第i个元素的和。

前缀和 O(n^2)
预处理一下数组 a [ ] a[] a[],将前缀和存入 s [ ] s[] s[]中,每次查询就只需要O(1)的时间

for(int i = 1; i <= n; i ++) s[i] = s[i - 1] + a[i]; // 求前缀和for(int r = 1; r <= n; r ++)for(int l = 1; l <= r; l ++)if((s[r] - s[l - 1]) % k == 0) ans ++;

但是这个时间还是会炸,所以还需要优化一层。

数学 O(n)
第二层循环的作用是枚举左端点,写出来就是(s[r] - s[0, r - 1]) % k = 0,当这个条件成立答案就加一。

化简: s[r]%k≡s[0,r−1]%k
现在这个式子就是:在模k的情况下,之前所有点和当前点有都少个相等。
因而再开一个额外的数组 c n t [ ] cnt[] cnt[]记录每个前缀和取余 k k k的余数的数量,遍历一遍就行。

3.代码实现

朴素作法:暴力枚举 O(N^3)

import java.util.Scanner;public class _1230K倍区间 {static Scanner sc = new Scanner(System.in);static int A[] = new int[100010];public static void main(String[] args) {int N = sc.nextInt();int K = sc.nextInt();int res = 0;for (int i = 1; i <= N; i++)A[i] = sc.nextInt();for (int R = 1; R <= N; R++) {//枚举右端点for (int L = 1; L <= R; L++) {//枚举左端点int sum =0;for (int i = L; i <= R; i++) {sum += A[i];}if (sum % K == 0) res++;}}System.out.println(res);}
}

优化二:二维前缀和优化 O(N^2)

import java.util.Scanner;public class _1230K倍区间 {static Scanner sc = new Scanner(System.in);static int s[] = new int[100010];public static void main(String[] args) {int N = sc.nextInt();int K = sc.nextInt();//处理二维前缀和数组for (int i = 1; i <= N; i++)s[i] =s[i-1]+sc.nextInt();int res = 0;for (int R = 1; R <= N; R++) {//枚举右端点for (int L = 1; L <= R; L++) {//枚举左端点int sum = s[R] - s[L - 1];if (sum % K == 0) res++;}}System.out.println(res);}
}

优化三:前缀和+存余数 O(N)

import java.util.Scanner;import java.util.Scanner;public class Main {static Scanner sc = new Scanner(System.in);static long s[] = new long[100010];// 前缀和数组 要开成long 防止爆intstatic int[] cnt = new int[100010];//存每个余数的个数数组public static void main(String[] args) {int N = sc.nextInt();int K = sc.nextInt();//处理前缀和数组for (int i = 1; i <= N; i++)s[i] = s[i - 1] + sc.nextInt();long res = 0;// cnt[0] = 1;//因为上面化简得到的L的取值范围是[0, r - 1]; cnt[0]中存的是s[]中等于0的数的个数 由于s[0] = 0 所以最初等于0的有1个数for (int i = 0; i <= N; i++) {//上面初始化cnt[0] = 1  i只需从 1开始res += cnt[(int) (s[i] % K)];cnt[(int) (s[i] % K)]++;}System.out.println(res);}
}

Acwing---1230.k倍区间相关推荐

  1. AcWing 1230. K倍区间

    首先我们要知道,(a-b)%c=0等价于a%c=b%c 给定一个长度为 N 的数列,A1,A2,-AN,如果其中一段连续的子序列 Ai,Ai+1,-Aj 之和是 K 的倍数,我们就称这个区间 [i,j ...

  2. (数论)(枚举)(前缀和)1230. K倍区间

    目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 -数-啦!我草,又~在-水-字-数-啦!我草,又~在-水-字-数-啦!我草,又~在-水-字- ...

  3. Sasha and a Bit of Relax K倍区间 (前缀和异或 前缀和计数 思维)

    (29条消息) CodeForces - 1109A Sasha and a Bit of Relax(思维+异或和,好题)_Frozen_Guardian的博客-CSDN博客 Sasha and a ...

  4. 蓝桥杯java第八届第十题--k倍区间

    标题: k倍区间给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区 ...

  5. [蓝桥杯][2017年第八届真题]k倍区间(数学+思维)

    题目描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. 你能求出 ...

  6. 蓝桥杯2017初赛-k倍区间-前缀和

    题目描述 给定一个长度为N的数列,A1, A2, - AN. 如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. 你能求 ...

  7. 2017蓝桥杯省赛---java---B---10(k倍区间)

    题目描述 标题: k倍区间给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...

  8. 【蓝桥杯 - 练习】k倍区间(思维,数组)

    题干: http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1 ...

  9. 蓝桥杯第八届省赛JAVA真题----k倍区间

    标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...

  10. 第八届蓝桥杯第十题 k倍区间

    给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间.  你能求出 ...

最新文章

  1. JMC | 人工智能在药物合成中的当前和未来作用(1)
  2. java学生背景知识要求,好好学习Java并发 一、背景知识
  3. 百度提出新冠高风险小区预警算法,AAAI21收录!
  4. 为什么大多数程序员都抽烟_为什么大多数重新设计都会失败
  5. 实现一个Ajax模式的文件上传功能有多难?
  6. Python之十点半小游戏
  7. [c++]在C++中定义常量的两种方法的比较
  8. Java join()原理分析
  9. 最新最全git使用大全
  10. 视频中的外挂字幕、硬字幕、软字幕定义的区别
  11. 移动wifi宝显示无服务器,优游宝4G随身WiFi解决方案 云SIM技术无需插卡
  12. 古体字与简体字对照表_古代汉语必备简化字与繁体字对照表
  13. Python批量给PDF加图片签名
  14. Oracle 创建新用户后无法登入,显示user lacks CREATE SESSION privilege; logon denied
  15. JavaScript 刮刮乐
  16. 【SDOI2008】Sandy的卡片 DP
  17. 【UE4 C++】实现发出伤害与接收伤害
  18. 中国大学慕课公开课-《视听语言》-学习笔记-2
  19. 写个.net开发者的Linux迁移指南
  20. 测试工程师应具备的素质

热门文章

  1. vue echarts调整图表和标题的距离
  2. 三国志战略版:Daniel_周瑜分析
  3. 如何通过Java将Word转换为PDF
  4. [又值奥运季] 2016年里约奥运会--8月15日赛事
  5. 导致网站服务器CPU跑满的原因
  6. 广东省计算机一级怎么查2020成绩,2020年下半年全国计算机等级考试成绩公布啦_中国教育考试网...
  7. 如何在iPhone5上更换铃声
  8. 在cad中出现“代理对象不允许复制 因此写块操作被拒绝”的解决办法
  9. 中山证券分析报告(0611)
  10. 深度学习(1):了解基本的深度学习框架框架及API