蓝桥杯备战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;
}
相关推荐
谎言西西里1 天前
LeetCode 热题100 --- 双指针专区
算法
qq_466302451 天前
vs2008 Hotlink实时数据读取
c++·qt
阿达King哥1 天前
关于C++中的typedef typename的含义
c++
leo__5201 天前
基于两步成像算法的聚束模式SAR MATLAB实现
开发语言·算法·matlab
前端小白在前进1 天前
力扣刷题:在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
咔咔咔的1 天前
3652. 按策略买卖股票的最佳时机
c++
某林2121 天前
基于SLAM Toolbox的移动机器人激光建图算法原理与工程实现
stm32·嵌入式硬件·算法·slam
修炼地1 天前
代码随想录算法训练营第四十三天 | 图论理论基础、深搜理论基础、卡码网98. 所有可达路径、797. 所有可能的路径、广搜理论基础
算法·深度优先·图论
iAkuya1 天前
(leetcode)力扣100 23反转链表(迭代||递归)
算法·leetcode·链表
剪一朵云爱着1 天前
PAT 1095 Cars on Campus
算法·pat考试