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

蓝桥杯 6. k倍区间

k倍区间

原题目链接

题目描述

给定一个长度为 N 的数列 A₁, A₂, ⋯, Aₙ,如果其中一段连续的子序列 Aᵢ, Aᵢ₊₁, ⋯, Aⱼ (i ≤ j) 之和是 K 的倍数,我们就称这个区间 [i, j]K 倍区间

请你求出数列中总共有多少个 K 倍区间


输入描述

  • 第一行包含两个整数 NK (1 ≤ N, K ≤ 10⁵)。
  • 接下来 N 行,每行一个整数 Aᵢ (1 ≤ Aᵢ ≤ 10⁵),表示数列的每个元素。

输出描述

输出一个整数,表示 K 倍区间的数量。


输入样例

5 2
1
2
3
4
5

输出样例

6

c++代码

#include<bits/stdc++.h>
#include<stdio.h>using namespace std;typedef long long ll;
ll N, K, ans = 0;
unordered_map<int, int> mp;
vector<ll> arr;int main() {scanf("%lld %lld", &N, &K);arr = vector<ll>(N + 1, 0);for (ll i = 1; i <= N; i++) {scanf("%lld", &arr[i]);arr[i] += arr[i - 1];}if (K == 1) {printf("%lld", (N * (N - 1)) / 2 + N);return 0;}for (int i = 0; i <= N; i++) mp[arr[i] % K]++;for (auto it = mp.begin(); it != mp.end(); it++) ans += ((it->second * (it->second - 1)) / 2);printf("%lld", ans);return 0;
}//by wqs

算法解析

首先前缀和想得到吧

for (ll i = 1; i <= N; i++) {scanf("%lld", &arr[i]);arr[i] += arr[i - 1];
}

现在有了前缀和数组

我们要找两个端点i, j,使得

(arr[j] - arr[i]) % k == 0
假设arr[j] % k = c, arr[i] % k = d,
根据取模公式(arr[j] - arr[i]) % k = c - d。
也就是我们要让c - d = 0,也就是c == d。
现在我们的任务转换为求有多少组i,j满足arr[i] % k == arr[j] % k。
for (int i = 0; i <= N; i++) mp[arr[i] % K]++;
for (auto it = mp.begin(); it != mp.end(); it++) ans += ((it->second * (it->second - 1)) / 2);//排列组合
printf("%lld", ans);

相关文章:

  • 来个去照片背景的GUI程序
  • git 根据http url设置账号密码
  • MySQL之text字段详细分类说明
  • 2025年C#人力外包趋势与价值分析
  • android studio 运行java main报错
  • 环状双向链表创建,删除,插入,遍历详细讲解
  • DDoS本地防御与绕线防御的区别
  • 三轴云台之开源算法篇
  • ubuntu配置网卡为AP模式
  • Spring Boot 中配置 Redis 连接池的详细
  • 台账自动统计——餐饮物资管理台账——仙盟共创平台——未来之窗
  • 软件测试之测试数据生成(Excel版)
  • 【function call】大模型的hello function call
  • 存储过程开发规范
  • Biu懂AI:本地部署大模型
  • 数字时代的AI与大数据:用高级AI开发技术革新大数据管理
  • Java实现Redis
  • [特殊字符] PostgreSQL MCP 开发指南
  • ruoyi中如何使用Public来存储静态资源
  • 全国青少年信息素养大赛 C++算法创意实践挑战赛初赛 集训模拟试卷《四》及详细答案解析
  • 个人做网站 优帮云/优化百度seo技术搜索引擎
  • vps远程桌面服务器租用/seo还有用吗
  • wordpress+相应太慢/谷歌seo靠谱吗
  • 网站设计分析/今日热点事件
  • 在大学做网站/房地产估价师考试
  • 做网站什么笔记本好用/发布外链的平台有哪些