蓝桥杯真题 k倍区间
考点:
- 利用前缀和求子列和
- 同余作差是模的倍数
题目概要
给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
你能求出数列中总共有多少个K倍区间吗?
输入 第一行包含两个整数N和K。(1 <= N, K <= 100000) 以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
输出 输出一个整数,代表K倍区间的数目。
例如,
输入: 5 2 1 2 3 4 5
程序应该输出: 6
资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗 < 2000ms
子列和问题的解法:前缀和(静态数据)、树状数组、区间数
给出代码
package demo;
import java.util.Scanner;
public class Main {
public static int k, n;
public static long ans = 0;
public static long[] a = new long[100010];
public static long[] s = new long[100010];
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
k = in.nextInt();
s[0] = 0;
for (int i = 1; i <= n; i++) {
a[i] = in.nextLong();
s[i] = s[i - 1] + a[i];
}
//枚举i,j,求得两者之间的区间和:s[j]-s[i-1],区间和可以是一个数
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
if ((s[j] - s[i - 1]) % k == 0)
ans++;
}
}
System.out.println(ans);
}
}
但这样的代码只能解决10的4次方规模的问题,而题目中给的是10的5次方。那么要对代码进行进一步的优化。
同余作差,一定是模的倍数,在余数相同的一堆里,任取两个,就可以相减得到子列和(C32组合数),最后要加上mod[0],因为余0的数有两种考虑模式:第一种是任选两个相减,第二种是这个数之间一个人做一个子列
优化后的代码
package demo;
import java.util.Scanner;
public class Main {
public static int k, n;
public static long ans = 0;
public static long[] a = new long[100010//这里可以不用开那么大的预空间
public static long[] s = new long[100010];//用的时候再开也可以的
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
k = in.nextInt();
long[] mod = new long[k];
s[0] = 0;
for (int i = 1; i <= n; i++) {
a[i] = in.nextLong();
s[i] = (s[i - 1] + a[i]) % k;
mod[(int) s[i]]++;
}
for (int i = 0; i < k; i++) {
// System.out.println("mod" + i + " = " + mod[i]);
ans = ans + mod[i] * (mod[i] - 1) / 2;
}
System.out.println(ans + mod[0]); // 所有能直接被k整除的都可以直接拿出来做一个区间
}
}
蓝桥杯真题 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倍区间. ...
- Java实现蓝桥杯 历届试题 k倍区间
历届试题 k倍区间 时间限制:2.0s 内存限制:256.0MB 问题描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j) ...
- 【蓝桥杯真题】地宫取宝(搜索->记忆化搜索详解)
链接 [蓝桥杯][2014年第五届真题]地宫取宝 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...
- Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...
- bfs记录路径,蓝桥杯真题
题意:在01矩阵中,找到一条从入口到终点的最短路径,并且打印这条路径. 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T291 #include<ios ...
- k倍区间:前缀和
[蓝桥杯][2017年第八届真题]k倍区间 题目描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数 ...
- k倍区间(解题报告)前缀和简单应用
测评地址 问题 1882: [蓝桥杯][2017年第八届真题]k倍区间 时间限制: 1Sec 内存限制: 128MB 提交: 351 解决: 78 题目描述 给定一个长度为N的数列,A1, A2, . ...
- 蓝桥杯-k倍区间
http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, .. ...
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
随机推荐
- VMwareWorkstation-安装虚拟机
安装vmware 首先就是下载VMware客户端了,Vmware是收费的,过好大多数都有破解版,或者激活码 这里我是用的是VMware16,下载在网上搜一下就有,例如 下载解压后里面有一个后缀为exe ...
- Android笔记--动态申请权限
动态申请权限 在动态申请权限这里,一共分为两种不同的模式,分别是Lazy模式(懒汉式)和Hungry模式(饿汉式),这两种模式区分的话,可以通俗地解释一下就是,对于懒汉来说,只有在我们点击某个按钮需要 ...
- Javaweb学习笔记第十六弹--Vue、Element
Vue(一套前端框架,MVVM主要用于实现数据的双向绑定) Vue快速入门 //新建HTML页面,引入Vue.js文件 <script src="js.Vue.js"> ...
- 加密脚本分析—evil.py
加密脚本分析-evil.py 1.题目 源文件 一共两个文件 enc_flag.txt evil.py(原文件无注释) 1 # coding: utf-8 2 3 import base64 4 im ...
- IO流详解及常用方法
1.1. 什么是IO流 IO流: Input/Output Stream 流: 指的是一串流动的数据, 在数据在流中按照指定的方向进行流动. 实现数据的读取.写入的功能. 1.2. IO流的使用场景 ...
- 基于swiper.js的异型轮播
基于原生swiper.js的异型轮播 <div class="swiper-container" > <div class="swiper-wrappe ...
- ES6let const
let const class 类 import 引入模块 export 暴露接口 // var a = 10; // let b = 20; // const c = 30; var和let比 co ...
- 每日复习------main()方法以及对象的初始化顺序
由于 Java 虚拟机需要调用类的 main()方法,所以该方法的访问权限必须是 public,又因为 Java 虚拟机在执行 main()方法时不必创建对象,所以该方法必须是 static 的,该方 ...
- 有关使用druid配置多数据源多个实例数据源和配置一个实例多个库
配置多数据源有以下几个说法. 1.多数据库类同时链接mysql,oracle,mongo等等 一般这样的配置这几个数据源不会存在一个实例(机器等)上.也属于多实例数据源. 类似如下图 有的是aliyu ...
- 在idea中将一个javase项目转成ee项目
在idea中将java项目转成web项目 1.创建一个java项目,new一个directory名为web(与src同级) 2. 为web指定根目录:ctrl+shift+alt+s,在module中 ...