例1:http://lx.lanqiao.cn/problem.page?gpid=T444

蓝桥杯
问题描述
  给定一个长度为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倍区间的数目。
分析:
1、因为(sum[r] - sum[l-1]) % k == 0,可推出sum[r] % k == sum[l - 1] % k.
2、因此,将前缀和分别对K取模。
3、分别统计出取模后的各数字的个数。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 100000 + 10;
int sum[MAXN];
int cnt[MAXN];
int main(){
int N, K;
scanf("%d%d", &N, &K);
for(int i = 0; i < N; ++i){
scanf("%d", &sum[i]);
}
sum[0] %= K;
for(int i = 1; i < N; ++i){
sum[i] = ((sum[i] % K) + sum[i - 1]) % K;
}
LL ans = 0;
for(int i = 0; i < N; ++i){
ans += cnt[sum[i]]++;
}
printf("%lld\n", ans + cnt[0]);
return 0;
}

例2:https://cn.vjudge.net/problem/POJ-3370

题意:每个邻居可以给ai个糖,共n个邻居,问向哪几个邻居要糖可以正好被c个孩子平分。

分析:此题和例1解法相似。

若sum[i] % c == 0,则[1, i]可以被c整除;

若sum[l - 1] % c == sum[r] % c,则[l, r]可以被c整除;

由于输出任意一种答案即可,那会不会存在一种可能,就是答案都不是连续的区间,而是不连续的区间呢?

由于本题中c<=n,因此一定存在连续区间的解。

原因在于,

若sum[i]能被c整除,一定存在连续区间的解[1, i];

若sum[i]不能被c整除,则sum[i]%c可能的结果在[1, c-1]里,共c-1种可能,而c-1<n,根据抽屉原理,因此一定存在一对i, j,使得sum[i] % c == sum[j] % c,即存在连续区间解[i + 1, j].

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int MAXN = 100000 + 10;
int sum[MAXN];
int id[MAXN];
int main(){
int c, n;
while(scanf("%d%d", &c, &n) == 2){
if(!c && !n) return 0;
memset(sum, 0, sizeof sum);
memset(id, 0, sizeof id);
for(int i = 1; i <= n; ++i){
scanf("%d", &sum[i]);
}
sum[1] %= c;
for(int i = 2; i <= n; ++i){
sum[i] = ((sum[i] % c) + sum[i - 1]) % c;
}
int st, et;
for(int i = 1; i <= n; ++i){
if(sum[i] == 0){
st = 1;
et = i;
break;
}
if(id[sum[i]]){
st = id[sum[i]] + 1;
et = i;
break;
}
id[sum[i]] = i;
}
for(int i = st; i <= et; ++i){
printf("%d", i);
if(i == et) printf("\n");
else printf(" ");
}
}
return 0;
}

例3:https://cn.vjudge.net/problem/POJ-2356

分析:与例2相似,因为N-1 < N,所以一定存在连续区间的解。

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int MAXN = 15000 + 10;
int a[MAXN];
int sum[MAXN];
int id[MAXN];
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
}
sum[1] = a[1] % n;
for(int i = 2; i <= n; ++i){
sum[i] = ((a[i] % n) + sum[i - 1]) % n;
}
int st, et;
for(int i = 1; i <= n; ++i){
if(sum[i] == 0){
st = 1;
et = i;
break;
}
if(id[sum[i]]){
st = id[sum[i]] + 1;
et = i;
break;
}
id[sum[i]] = i;
}
printf("%d\n", et - st + 1);
for(int i = st; i <= et; ++i){
printf("%d\n", a[i]);
}
return 0;
}

  

【题集】k倍区间(抽屉原理)的更多相关文章

  1. 2017蓝桥杯第十题(k倍区间)

    #include<iostream> #include<stdio.h> using namespace std; ; ],a[N]; int lowbit(int n){ r ...

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

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

  3. 蓝桥杯-k倍区间

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

  4. k倍区间:前缀和

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

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

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

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

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

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

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

  8. k倍区间

    看大佬的代码看了半天,终于算是懂了 标题: k倍区间 给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就 ...

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

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

随机推荐

  1. 解决方法:Could not load file or assembly 'WebGrease, Version=1.5.1.25624, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.

    最近使用VS2015调试ASP.NET 程序遇到了该问题: 在网上找了很多方法都不能解决,最后自己解决了,方法如下: 在project -> NuGet管理中找到已安装的所有程序:将Web Op ...

  2. VS release模式下进行调试设置

    工程项目上右键 打开 属性界面 1.c++ ---  常规 ---- 调试信息格式 选  程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi) 2.c/c++ ---- 优化 ---- ...

  3. PAT T1002 Business

    背包问题,把任务按截止日期排序,再按背包问题处理~ #include<bits/stdc++.h> using namespace std; ; struct node { int c; ...

  4. C++打开文件夹

    https://bbs.csdn.net/topics/392055617?page=1   见2楼 system("start \"\" \"文件夹路径\&q ...

  5. 第2节 Scala中面向对象编程:9、getClass和classOf;10、调用父类的constructor;11、抽象类和抽象字段;

    6.3.4.     Scala中getClass 和 classOf Class A extends class B B b=new A    b.getClass ==classOf[A] B b ...

  6. js中的arguments、Array.prototype.slice.call()

    类数组对象:arguments js把传入到这个函数的全部参数存储在arguments里面,其实arguments也是个对象,而且是一个特殊的对象,它的属性名是按照传入参数的序列来的,第1个参数的属性 ...

  7. 「JOI2019 Final」解题报告

    传送门 「JOI2019 Final」勇者比太郎 看懂题就很简单了,后缀和随便维护一下就好了,别用树状数组强加一个\(\log\)就行. 「JOI2019 Final」画展 显然可以先把所有的画框按大 ...

  8. 搭建springboot的ssm(spring + springmvc + mybatis)的maven项目

    最终项目目录结构 创建过程 1.创建开关SpringBootApplication 为了创建快速.我们使用idea自带的创建springboot来创建结构,当然创建普通的web项目也是可以的.(使用e ...

  9. 网络请求中的URL中传bool型数据

    如果在URL中要拼接bool的数据,OC这边不能使用BOOL型.因为使用NSString的拼接字符串类方法中,会将BOOL型数据转化为0或者1. 解决办法: NSString *overdue_str ...

  10. 题解 P3950 【部落冲突】

    树链剖分吼啊 一看就看出是LCT模板题啦 前记 见这么多人写LCT,却很少人写树链剖分,于是我就来一发树链剖分(其实是因为自己不会LCT) 本蒟蒻的写法和诸位写树链剖分的大神有点不同 思路 树链剖分, ...