hh的蓝桥杯每日一题--前缀和

1230. K倍区间 - AcWing题库

我一开始用暴力的方式做,果不其然超时了;

观察这个条件:

复制代码
(S[j] - S[i-1]) % k == 0

根据模运算的性质:

复制代码
如果 (a - b) % k == 0
那么 a % k == b % k

所以

复制代码
(S[j] - S[i-1]) % k == 0
⇔ S[j] % k == S[i-1] % k

这就是最重要的转化!我们把「区间和能被K整除」转化成了「两个前缀和模K同余」。

现在问题变成:

有多少对 (i-1, j) 满足 0 ≤ i-1 < j ≤ n 且 Si-1 % k == Sj % k

这等价于:

统计每个余数出现了多少次,然后从同余数中任选2个

也就是说,设余数 r 出现了 cntr 次,那么贡献是:C(cntr, 2) = cntr × (cntr - 1) / 2

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
int n,k;
ll s[N];
ll cnt[N];

int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		s[i]=s[i-1]+x;
	}
	cnt[0]=1;
	for(int i=1;i<=n;i++)
	{
		cnt[(s[i]%k+k)%k]++;
	}
	
	ll res=0;
	for(int i=0;i<k;i++)
	{
		res+=cnt[i]*(cnt[i]-1)/2;
	}
	cout<<res<<endl;
	return 0; 
}
相关推荐
rannn_11110 小时前
【力扣hot100】二叉树专题
算法·leetcode·职场和发展
LayZhangStrive11 小时前
提示词沉淀 - 使用豆包时平时提问题
面试·职场和发展·prompt·提示词·豆包
Escalating_xu1 天前
【Linux】进程信号:从产生、阻塞与递达到 sigaction、可重入与内核返回路径
linux·运维·面试·职场和发展
吃着火锅x唱着歌2 天前
LeetCode 3597.分割字符串
算法·leetcode·职场和发展
.道阻且长.2 天前
8.LeetCode算法习题讲解--滑动窗口--长度最小的子数组
算法·leetcode·职场和发展
测试19982 天前
Python接口测试之requests库安装和导入
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
浅念-2 天前
MySQL 索引底层完整详解|磁盘Page|B+树推导|聚簇非聚簇索引|索引SQL操作
大数据·数据库·b树·sql·mysql·面试·职场和发展
我命由我123452 天前
商圈六大配套
学习·职场和发展·求职招聘·职场发展·产品经理·学习方法·零售
Dr.kangder2 天前
嵌入式面试总结(二十二)——指针
java·面试·职场和发展·架构·嵌入式
Dr.kangder2 天前
嵌入式面试总结(二十)——ISA原理
单片机·面试·职场和发展·系统架构·嵌入式