Acwing---1230.k倍区间
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倍区间相关推荐
- AcWing 1230. K倍区间
首先我们要知道,(a-b)%c=0等价于a%c=b%c 给定一个长度为 N 的数列,A1,A2,-AN,如果其中一段连续的子序列 Ai,Ai+1,-Aj 之和是 K 的倍数,我们就称这个区间 [i,j ...
- (数论)(枚举)(前缀和)1230. K倍区间
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 -数-啦!我草,又~在-水-字-数-啦!我草,又~在-水-字-数-啦!我草,又~在-水-字- ...
- Sasha and a Bit of Relax K倍区间 (前缀和异或 前缀和计数 思维)
(29条消息) CodeForces - 1109A Sasha and a Bit of Relax(思维+异或和,好题)_Frozen_Guardian的博客-CSDN博客 Sasha and a ...
- 蓝桥杯java第八届第十题--k倍区间
标题: k倍区间给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区 ...
- [蓝桥杯][2017年第八届真题]k倍区间(数学+思维)
题目描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. 你能求出 ...
- 蓝桥杯2017初赛-k倍区间-前缀和
题目描述 给定一个长度为N的数列,A1, A2, - AN. 如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. 你能求 ...
- 2017蓝桥杯省赛---java---B---10(k倍区间)
题目描述 标题: k倍区间给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...
- 【蓝桥杯 - 练习】k倍区间(思维,数组)
题干: http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1 ...
- 蓝桥杯第八届省赛JAVA真题----k倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...
- 第八届蓝桥杯第十题 k倍区间
给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. 你能求出 ...
最新文章
- JMC | 人工智能在药物合成中的当前和未来作用(1)
- java学生背景知识要求,好好学习Java并发 一、背景知识
- 百度提出新冠高风险小区预警算法,AAAI21收录!
- 为什么大多数程序员都抽烟_为什么大多数重新设计都会失败
- 实现一个Ajax模式的文件上传功能有多难?
- Python之十点半小游戏
- [c++]在C++中定义常量的两种方法的比较
- Java join()原理分析
- 最新最全git使用大全
- 视频中的外挂字幕、硬字幕、软字幕定义的区别
- 移动wifi宝显示无服务器,优游宝4G随身WiFi解决方案 云SIM技术无需插卡
- 古体字与简体字对照表_古代汉语必备简化字与繁体字对照表
- Python批量给PDF加图片签名
- Oracle 创建新用户后无法登入,显示user lacks CREATE SESSION privilege; logon denied
- JavaScript 刮刮乐
- 【SDOI2008】Sandy的卡片 DP
- 【UE4 C++】实现发出伤害与接收伤害
- 中国大学慕课公开课-《视听语言》-学习笔记-2
- 写个.net开发者的Linux迁移指南
- 测试工程师应具备的素质
热门文章
- vue echarts调整图表和标题的距离
- 三国志战略版:Daniel_周瑜分析
- 如何通过Java将Word转换为PDF
- [又值奥运季] 2016年里约奥运会--8月15日赛事
- 导致网站服务器CPU跑满的原因
- 广东省计算机一级怎么查2020成绩,2020年下半年全国计算机等级考试成绩公布啦_中国教育考试网...
- 如何在iPhone5上更换铃声
- 在cad中出现“代理对象不允许复制 因此写块操作被拒绝”的解决办法
- 中山证券分析报告(0611)
- 深度学习(1):了解基本的深度学习框架框架及API