当前位置: 首页 > news >正文

【题集】k倍区间(抽屉原理)

例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;
}

  

转载于:https://www.cnblogs.com/tyty-Somnuspoppy/p/8454521.html

相关文章:

  • 006 数组
  • 寒假作业3
  • 前端面试题 ---- html篇
  • CSS实现点击3D效果
  • 2018/02/24
  • Vijos p1772 巧妙填数
  • js 中的call apply
  • 对RESTfull的初见理解
  • 微信小程序开发01
  • 敏捷软件开发:原则、模式与实践
  • Linux chown问题分享
  • 【转载】Git,Github和Gitlab简介和基本使用Gitlab安装和使用
  • 面试中自己项目和你应该问的问题环节总结
  • AMR文件结构
  • python基础(14)-反射类的内置函数
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Apache的80端口被占用以及访问时报错403
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js面向对象
  • MySQL的数据类型
  • mysql外键的使用
  • PAT A1092
  • rc-form之最单纯情况
  • Redux 中间件分析
  • SQLServer插入数据
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 复杂数据处理
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端路由实现-history
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 项目管理碎碎念系列之一:干系人管理
  •  一套莫尔斯电报听写、翻译系统
  • 原生Ajax
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • #Java第九次作业--输入输出流和文件操作
  • #mysql 8.0 踩坑日记
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (10)ATF MMU转换表
  • (javascript)再说document.body.scrollTop的使用问题
  • (第61天)多租户架构(CDB/PDB)
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计高校学生选课系统
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .net core Swagger 过滤部分Api
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Core中Emit的使用
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net(C#)常用转换byte转uint32、byte转float等