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

AcWing 1230.K倍区间

AcWing 1230. K倍区间

题目描述

给定一个长度为 NNN 的数列,A1,A2,…ANA_1, A_2, … A_NA1,A2,AN ,如果其中一段连续的子序列 Ai,Ai+1,…AjA_i, A_{i+1}, … A_jAi,Ai+1,Aj 之和是 KKK 的倍数,我们就称这个区间 [i,j][i,j][i,j]KKK 倍区间。

你能求出数列中总共有多少个 KKK 倍区间吗?

输入格式

第一行包含两个整数 NNNKKK

以下 NNN 行每行包含一个整数 AiA_iAi

输出格式

输出一个整数,代表 KKK 倍区间的数目。

数据范围

1≤N,K≤1000001≤N,K≤1000001N,K100000,
1≤Ai≤1000001≤A_i≤1000001Ai100000

输入样例:

5 2
1
2
3
4
5

输出样例:

6

思路

求区间 [l,r][l,r][l,r] 的和是 kkk 的倍数的个数。

求区间和,我们可以通过 前缀和 来求出。

定义 sum[i] 表示第 111 个元素到第 iii 个元素的和,那么 s[r] - s[l-1] 就是区间 [l,r][l,r][l,r] 的和。

若满足条件:区间 [l,r][l,r][l,r] 的和是k的倍数,即 (s[r] - s[l-1]) % k == 0 ,等价于 s[r] % k == s[l-1] % k

说人话,这也就意味着:

如果 s[r] mod ks[l - 1] mod k 的余数相等,那么 s[r] - s[l - 1] 的差值必然是 kkk 的倍数。

比如:13 % 7 == 20 % 7,则 (20 - 7) % 7 == 0

那么题目就是要我们求 前缀和%k==0 的组合有多少种。

cnt[i] 存储目前为止前缀和相同的个数,iii 表示这个前缀和的值。

每次用 res 来递加 cnt[i] 相同的个数,前面有几个 前缀和的值 和 当前前缀和 相等,那么这个前缀和就能和前面每一个组成一个组合,所以要 res += cnt[s[i]] ,然后再加上现在的前缀和,即 cnt[s[i]]++

初始化 cnt[0] = 1 ,因为当 s[i] == 0 时,这个前缀和本身就是 kkk 的倍数,不需要再跟别的前缀和组合,计算结果时就要加上这一个。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 1e5 + 10;int n, k;
ll s[N];
ll cnt[N];int main()
{cin >> n >> k;ll res = 0;cnt[0] = 1;for (int i = 1; i <= n; i++){cin >> s[i];s[i] = (s[i] + s[i - 1]) % k;   //每次前缀和都取模res += cnt[s[i]];   //和前面每一个都组合一下cnt[s[i]]++;   //现在又多了一个}cout << res << endl;return 0;
}

http://www.lryc.cn/news/5417.html

相关文章:

  • kubernetes集群部署springcloud项目【AL】【未写完】
  • 各种音频接口比较
  • 软件测试面试理论(超详细)
  • c++学习笔记-二进制文件操作(哔站-黑马程序员c++教学视频)
  • 内网渗透(二十三)之Windows协议认证和密码抓取-Mimikatz介绍和各种模块使用方法
  • Nginx if的使用教程
  • 备考蓝桥杯【快速排序和归并排序】
  • Taro使用微信OCR插件无法调用onSuccess回调问题
  • 【Java】代码块的细节你搞懂了吗(基础知识七)
  • 设计模式C++实现12:抽象工厂模式
  • 目标检测论文阅读:GraphFPN算法笔记
  • 实测2023款哪吒U-II,智驾功能对女司机很友好
  • Python自动化测试【软件测试最全教程(附笔记、学习路线)】,看完即就业
  • 2023/2/13总结
  • webSock前端
  • AcWing 3956. 截断数组(每日一题)
  • Android 一体机研发之修改系统设置————屏幕亮度
  • C++通用算法
  • Springboot停机方式
  • Linux perf_event_open 简介
  • Java给定两组起止日期,求交集
  • 数组的复制与二维数组的用法
  • JS判断两个table数据是否完全相等(判断两个数组对象是否完全相等)
  • 关于小程序,你想知道的这些
  • WuThreat身份安全云-TVD每日漏洞情报-2023-02-13
  • 【Linux】软件安装(三分钟教会你如何在linux下安装软件)
  • Fluent Python 笔记 第 10 章 序列的修改、散列和切片
  • 在中国程序员工作是青春饭吗?
  • Linux tcpdump
  • redis知识汇总(部署、高可用、集群)