蓝桥杯备战22.k倍区间——前缀和

目录

题目

分析

暴力求解

优化思路

AC代码


题目链接:

P8649 [蓝桥杯 2017 省 B] k 倍区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目

分析

很明显这题是一道前缀和的题

暴力求解

只得了28分

cpp 复制代码
#include<iostream>
using namespace std;
const int N = 2e5+10,M=1e3+10;
int a[N],pre[N];
int main()
{
	int n,k;cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		pre[i]=pre[i-1]+a[i];	
	}
	int ans = 0;
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			if((pre[j]-pre[i])%k==0)ans++;
		}
	}
	cout<<ans;
	return 0;
}

优化思路

同余定理,当他们的模数相同时候,做差的模为0

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+10,M=1e3+10;
int a[N],pre[N];
signed main()
{
	map<int,int>mp;
	int n,k;cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		pre[i]=(pre[i-1]+a[i])%k;
		mp[pre[i]]++;	
	}
	int ans = 0;
	for(auto i:mp)
	{
		if(i.first==0)
		{
			ans+=i.second*(i.second+1)/2;
		}
		else
		{
			ans+=i.second*(i.second-1)/2;
		}
	}
	cout<<ans;
	return 0;
}
相关推荐
bkspiderx11 分钟前
C++中的map容器:键值对的有序管理与高效检索
开发语言·c++·stl·map
AlenTech11 分钟前
226. 翻转二叉树 - 力扣(LeetCode)
算法·leetcode·职场和发展
Hard but lovely12 分钟前
Linux: 线程同步-- 基于条件变量 &&生产消费模型
linux·开发语言·c++
Tisfy15 分钟前
LeetCode 1458.两个子序列的最大点积:动态规划
算法·leetcode·动态规划·题解·dp
求梦82015 分钟前
【力扣hot100题】合并区间(9)
算法·leetcode·职场和发展
汽车仪器仪表相关领域30 分钟前
工况模拟精准检测,合规减排赋能行业 ——NHASM-1 型稳态工况法汽车排气检测系统项目实战经验分享
数据库·算法·单元测试·汽车·压力测试·可用性测试
L_090733 分钟前
【C++】高阶数据结构 -- 平衡二叉树(AVLTree)
数据结构·c++
今儿敲了吗34 分钟前
C++概述
c++·笔记
chilavert31840 分钟前
技术演进中的开发沉思-299 计算机原理:数据结构
算法·计算机原理
C+-C资深大佬1 小时前
C++逻辑运算
开发语言·c++·算法