k倍区间 前缀和【蓝桥杯2017 C/C++ B组】
标题: 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
先求出每一位的前缀和并取余 那么任意区间[l,r]的和就可以通过sum[r]-sum[l-1]来得到
要求区间和为k的倍数,即(sum[r]%k - sum[l-1])%k==0
移项 sum[r] % k == sum[l-1] % k
那么每两个对k取余得到值相同的sum 就可以组成一个k倍区间
所以我们要统计下余数为0--k-1的前缀和个数
取余为0的前缀和 说明[0,i]区间就已经存在一个k倍区间了 当然他还能跟另一个前缀和取余为0的[0,j]区间 组合成为[i,j]的k倍区间
所以刚开始我们应该先把取余为0的个数加上
然后对于所有取余相同的 两两配对能组成一个k倍区间,那么假设有x个取余相同的前缀和 那么他可以组成 ((x-1)*x)/2 个k倍区间 例如有 4个数 两两组合 3+2+1 = 3*(3-1)=6
其实是等差数列求和公式 n*(n+1)/2 不过这里的n = x-1;
#include<bits/stdc++.h>
using namespace std;
//int 只有85分
long long a[],sum[],num[];
int main()
{
int n,k ;
cin >> n >> k;
for(int i = ; i < n; i++){
cin >> a[i];
}
sum[] = a[]%k;
for(int i = ; i < n; i++){
sum[i] = (sum[i-]+a[i])%k; //求每个前缀和并趋于
}
memset(num,,sizeof num);
for(int i = ; i < n; i++){
num[sum[i]] ++; // 统计余数为 0 -- k-1的个数
}
long long ans = num[]; //能取余为0 自己本身就存在一个k倍区间了
for(int i = ; i < k; i++){
ans += (num[i]*(num[i]-))/ ; //两两配对 等差数列 n*(n+1)/2 这里n=num[i]-1
}
cout << ans << endl;
}
k倍区间 前缀和【蓝桥杯2017 C/C++ B组】的更多相关文章
- [蓝桥杯2017初赛]k倍区间 前缀和
题目描述 给定一个长度为N的数列,A1, A2, ... AN. 如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 算法笔记_127:蓝桥杯2017模拟赛-本科组习题解答(Java)
目录 1 算年龄 2 猜算式 3 排列序数 4 字符串比较 5 还款计算 6 滑动解锁 7 风险度量 PS:以下代码部分仅供参考,若有不当之处,还请路过同学指出哦~ 1 算年龄 标题:算年龄 英 ...
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 蓝桥杯试题 k倍区间(dp)
问题描述 给定一个长度为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倍区间. ...
- 蓝桥杯-k倍区间
http://lx.lanqiao.cn/problem.page?gpid=T444 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, .. ...
- 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) ...
- k倍区间:前缀和
[蓝桥杯][2017年第八届真题]k倍区间 题目描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数 ...
随机推荐
- Maximum-SubsequenceSum
题目 https://pintia.cn/problem-sets/900290821590183936/problems/900291257604861953 给出一段数列,求数列的最大子列和,并输 ...
- 《大话设计模式》c++实现 建造者模式
一.UML图 关键词:Subject维护一个Observer列表,Subject执行Notify()时就执行列表中的每个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的依 ...
- python ip代理
import random import urllib.request from bs4 import BeautifulSoup import time url ='http://www.whati ...
- DataRow 点不出 Select
DataRow 点不出 Select?why?using system.linq;
- C# vs2015单元测试测试资源管理器不显示测试方法
问题描述:在用VS2015用测试框架NUnit单元测试的时候,测试资源管理器死活不出现测试方法,无法运行单元测试模块 现象如下图: 原因:nunit版本不对应 解决方案:下载nunit3.0及往上的版 ...
- html5-section元素
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- [转][LoadRunner]LR性能测试结果样例分析
LR性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源 ...
- KKT条件原理
问题引入 max f(x, y) s.t. g(x,y) <= 0 几何解释 a. g(x ,y) <= 0为上图中z = 0平面中的圆,圆的边表示g(x, y) = 0,圆的内部表示g ...
- Spring NoSuchBeanDefinitionException
转http://www.baeldung.com/spring-nosuchbeandefinitionexception 1. Overview In this article, we are di ...
- 原生JavaScript插件编写指南(转载)
原生js开发指南 https://www.jianshu.com/p/e65c246beac1 在jQuery大量使用的环境下,目前网上的众多jQuery插件也能基本满足要求,但是在项目具体需求下,有 ...