考点:

- 利用前缀和求子列和

- 同余作差是模的倍数

题目概要

给定一个长度为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倍区间的更多相关文章

  1. 第八届蓝桥杯省赛 K倍区间

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

  2. [蓝桥杯2017初赛]k倍区间 前缀和

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

  3. Java实现蓝桥杯 历届试题 k倍区间

    历届试题 k倍区间 时间限制:2.0s 内存限制:256.0MB 问题描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j) ...

  4. 【蓝桥杯真题】地宫取宝(搜索->记忆化搜索详解)

    链接 [蓝桥杯][2014年第五届真题]地宫取宝 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...

  5. Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)

    887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  6. bfs记录路径,蓝桥杯真题

    题意:在01矩阵中,找到一条从入口到终点的最短路径,并且打印这条路径. 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T291 #include<ios ...

  7. k倍区间:前缀和

    [蓝桥杯][2017年第八届真题]k倍区间 题目描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数 ...

  8. k倍区间(解题报告)前缀和简单应用

    测评地址 问题 1882: [蓝桥杯][2017年第八届真题]k倍区间 时间限制: 1Sec 内存限制: 128MB 提交: 351 解决: 78 题目描述 给定一个长度为N的数列,A1, A2, . ...

  9. 蓝桥杯-k倍区间

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

  10. 2017第八届蓝桥杯 K倍区间

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

随机推荐

  1. VMwareWorkstation-安装虚拟机

    安装vmware 首先就是下载VMware客户端了,Vmware是收费的,过好大多数都有破解版,或者激活码 这里我是用的是VMware16,下载在网上搜一下就有,例如 下载解压后里面有一个后缀为exe ...

  2. Android笔记--动态申请权限

    动态申请权限 在动态申请权限这里,一共分为两种不同的模式,分别是Lazy模式(懒汉式)和Hungry模式(饿汉式),这两种模式区分的话,可以通俗地解释一下就是,对于懒汉来说,只有在我们点击某个按钮需要 ...

  3. Javaweb学习笔记第十六弹--Vue、Element

    Vue(一套前端框架,MVVM主要用于实现数据的双向绑定) Vue快速入门 //新建HTML页面,引入Vue.js文件 <script src="js.Vue.js"> ...

  4. 加密脚本分析—evil.py

    加密脚本分析-evil.py 1.题目 源文件 一共两个文件 enc_flag.txt evil.py(原文件无注释) 1 # coding: utf-8 2 3 import base64 4 im ...

  5. IO流详解及常用方法

    1.1. 什么是IO流 IO流: Input/Output Stream 流: 指的是一串流动的数据, 在数据在流中按照指定的方向进行流动. 实现数据的读取.写入的功能. 1.2. IO流的使用场景 ...

  6. 基于swiper.js的异型轮播

    基于原生swiper.js的异型轮播 <div class="swiper-container" > <div class="swiper-wrappe ...

  7. ES6let const

    let const class 类 import 引入模块 export 暴露接口 // var a = 10; // let b = 20; // const c = 30; var和let比 co ...

  8. 每日复习------main()方法以及对象的初始化顺序

    由于 Java 虚拟机需要调用类的 main()方法,所以该方法的访问权限必须是 public,又因为 Java 虚拟机在执行 main()方法时不必创建对象,所以该方法必须是 static 的,该方 ...

  9. 有关使用druid配置多数据源多个实例数据源和配置一个实例多个库

    配置多数据源有以下几个说法. 1.多数据库类同时链接mysql,oracle,mongo等等 一般这样的配置这几个数据源不会存在一个实例(机器等)上.也属于多实例数据源. 类似如下图 有的是aliyu ...

  10. 在idea中将一个javase项目转成ee项目

    在idea中将java项目转成web项目 1.创建一个java项目,new一个directory名为web(与src同级) 2. 为web指定根目录:ctrl+shift+alt+s,在module中 ...