题目描述

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

题解:首先暴力判断一定会超时的,

如果区间[l,r]的和(sum[r]-sum[l])%k==0,那么sum[r]%k==sum[l]%k,

所以只要判断有几个前缀和%k的值相等,即可以判断几个区间和%k==0

用样例举个例子:

sum[1]%2==1       此时vis[1]==0,所以ans=ans+vis[1]=0     vis[1]=1

sum[2]%2==1  此时vis[1]==1,所以ans+ans+vis[1]=1     vis[1]=2

sum[3]%2==0  此时vis[0]==0,所以ans=ans+vis[0]=1           vis[0]=1

sum[4]%2==0  此时vis[0]==1,所以ans=ans+vis[0]=2      vis[0]=2

sum[5]%2==1  此时vis[1]==2,所以ans=ans+vis[1]=4      vis[1]=3

这个时候ans=4,这里统计的是区间(1,n]之间的子区间和%k==0的区间个数,还要加上[1,n]之间区间和%k==0的个数(以样例为例是区间[1,3]和[1,4])

所以ans=6

注意ans用long long

#include<iostream>
#include<string>
#include<algorithm>
#include<math.h>
#include<string.h>
#define ll long long
using namespace std;
int a[],sum[],vis[];
int main()
{
int n,k;
cin>>n>>k;
ll ans=;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)
{
cin>>a[i];
sum[i]=(sum[i-]+a[i])%k;//如果区间[l,r]的和(sum[r]-sum[l])%k==0
ans=ans+vis[sum[i]]; //那么sum[r]%k==sum[l]%k
vis[sum[i]]++; //所以只要判断有几个前缀和%k的值相等,即可以判断几个区间和%k==0
}
cout<<ans+vis[]<<endl;
return ;
}
 

[蓝桥杯2017初赛]k倍区间 前缀和的更多相关文章

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

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

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

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

  3. k倍区间 前缀和【蓝桥杯2017 C/C++ B组】

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

  4. [蓝桥杯2017初赛]青蛙跳杯子 BFS

    题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...

  5. [蓝桥杯2017初赛]Excel地址

    题目描述 Excel单元格的地址表示很有趣,它使用字母来表示列号. 比如,A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,.... 当然Excel的最 ...

  6. [蓝桥杯2017初赛]跳蚱蜢 BFS

    题目描述 如图所示: 有9只盘子,排成1个圆圈.其中8只盘子内装着8只蚱蜢,有一个是空盘. 我们把这些蚱蜢顺时针编号为 1~8.每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空 ...

  7. [蓝桥杯2017初赛]迷宫 DFS

    题目描述 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则: L表示走到左边的房间,R表示走到右边 ...

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

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

  9. 蓝桥杯试题 k倍区间(dp)

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

随机推荐

  1. powerdesigner16.5改变数据模型字体大小

    1. 点击 2. 选择 3. 选择完点击确定后: 4. 点击设为默认:再点ok

  2. E. Vus the Cossack and a Field (求一有规律矩形区域值) (有一结论待证)

    E. Vus the Cossack and a Field (求一有规律矩形区域值) 题意:给出一个原01矩阵,它按照以下规则拓展:向右和下拓展一个相同大小的 0 1 分别和原矩阵对应位置相反的矩阵 ...

  3. AWD - IDE For Web dev汉化版

    一款安卓上的HTML网页编辑软件,不错哦 下载链接 http://t.cn/AiRIvtoL

  4. docker容器 - 宿主机和容器之间复制文件(cp)

    实验环境 CentOS 7.5 容器 容器是镜像的运行实例.不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层:同时,容器中的应用进程处于运行状态. 主机和容器之间复制文件 要想实现在主 ...

  5. 我的reshape观

    reshape(1,2)把结果分成1块,每一块2个元素 reshape(2,1)把结果分成2块,每一块1个元素 reshape(-1,1)把结果分成任意块,每一块1个元素 reshape(1,-1)把 ...

  6. 安装VMware Tools和设置屏幕

    在虚拟机窗口的虚拟机-安装VMware Tools,点击安装,直到安装完成,出现以下界面 在主文件夹中新建VM文件夹,将VMware Tools中的VMwareTools-10.0.10-430167 ...

  7. Java-POJ1002-487-3279(含c++代码)

    Java 的读入还不熟练,解决不了空行的问题,还是只能用c++ A掉,唉~ 之后要把这个坑补掉 解决了,开心(*^▽^*)以下是AC的Java代码 以下是C++代码 #include<cstdi ...

  8. linux下修改mysql的编码格式

    修改编码格式:https://blog.csdn.net/qq_30038111/article/details/79376137         改编码格式在配置文件中修改才有效,在命令行中修改没效 ...

  9. 吴裕雄 python 机器学习——多项式贝叶斯分类器MultinomialNB模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,naive_bayes from skl ...

  10. 【音乐欣赏】《JINGO JUNGLE》 - MYTH & ROID

    歌名:JINGO JUNGLE 作者:MYTH & ROID [00:19.82]Don’t go away 逃げ場はない [00:27.12]Oh why? You’re crying 嗤え ...