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 且 S[i-1] % k == S[j] % k

这等价于:

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

也就是说,设余数 r 出现了 cnt[r] 次,那么贡献是:C(cnt[r], 2) = cnt[r] × (cnt[r] - 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; 
}
相关推荐
敲代码的嘎仔1 天前
Java后端面试——SSM框架面试题
java·面试·职场和发展·mybatis·ssm·springboot·八股
仰泳的熊猫1 天前
题目2571:蓝桥杯2020年第十一届省赛真题-回文日期
数据结构·c++·算法·蓝桥杯
逆境不可逃1 天前
LeetCode 热题 100 之 33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值 4. 寻找两个正序数组的中位数
java·开发语言·数据结构·算法·leetcode·职场和发展
杰克尼1 天前
七天速刷面试--day03
面试·职场和发展
云泽8081 天前
蓝桥杯算法精讲:倍增思想与离散化深度剖析
算法·职场和发展·蓝桥杯
清风徐来QCQ1 天前
全栈开发面试1
面试·职场和发展
nglff1 天前
蓝桥杯抱佛脚第四天|前缀和,差分对应练习
算法·职场和发展·蓝桥杯
_饭团1 天前
字符串函数全解析:12 种核心函数的使用与底层模拟实现
c语言·开发语言·学习·考研·面试·蓝桥杯
想吃火锅10051 天前
【leetcode】105. 从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
前端摸鱼匠1 天前
面试题4:多头注意力(MHA)相比单头注意力的优势是什么?Head数如何影响模型?
人工智能·ai·面试·职场和发展·求职招聘