[蓝桥杯2017初赛]k倍区间(旧题新做)

本文介绍了蓝桥杯2017年初赛中一道关于k倍区间的题目,并提供了一种高效的解决方案。通过使用前缀和及余数相减的方法,实现了快速判断区间内元素之和是否为k的倍数的目标。
// [蓝桥杯2017初赛]k倍区间
//这道题我只想说好你个余数相同差为零,瞬间打开我的思路
//我最初暴力遍历了,但是时间可能会超时,我再想个解法,就是用前缀和,但是我这次用的前缀和方法不对,时间复杂度仍然是O(N^2)
//最后看大佬的博客原来是余数相减,%k余数相同的前缀和直接相减就是就是k的倍数

#include<bits/stdc++.h>
using namespace std;
#define ll long long

//ll n,k;
//ll a[N];
//bool check(ll x,ll y){
//	ll sum=0;
//	for(ll i=0;i<=y;i++){
//		sum+=a[x+i];
//	}
//	if(sum%k==0) return true;
//	return false;
//}
int main(){
//	ll ans=0;
//	cin>>n>>k;
//	for(ll i=0;i<n;i++){
//		cin>>a[i];
//	}
//	for(ll i=0;i<n;i++){
//		for(ll j=0;j<n&&j+i<n;j++){
//			if(check(i,j)){
//				ans++;
//			}
//		}
//	}
//	cout<<ans;

	ll n,k,i;
	cin>>n>>k;
	ll a[n+1];
	a[0]=0;
	map<ll,ll> m;
	for(ll i=1;i<=n;i++){
		cin>>a[i];
		a[i]+=a[i-1];
		ll t=a[i]%k;
		m[t]++;
	}
	ll ans=0;
	for(i=0;i<k;i++){
		ans+=m[i]*(m[i]-1)/2;
	}
	cout<<ans+m[0];
}
### 蓝桥杯 C语言 最少刷数量建议 为了应对蓝桥杯竞赛中的编程挑战,尤其是涉及动态规划(DP)、前缀和等问题时,掌握一定的目练习量是非常重要的。以下是关于如何准备以及所需最少刷数量的一些建议: #### 一、基础知识点复习 在开始刷之前,确保已经熟练掌握了C语言的基础语法和常用数据结构。这些基础知识包括但不限于变量声明、循环控制语句、函数定义与调用、指针操作、数组处理等内容[^1]。 #### 二、核心算法学习 针对像“最少刷数”这样的问题,重点在于理解并实现特定的算法逻辑。例如,在解决该类问题时可以采用如下方法之一——利用前缀和来统计不同区间内的频率分布情况,并通过遍历寻找满足条件的最佳分割点位置[^2]。 ```c #include <stdio.h> #define MAXN 100005 int main(){ int n; scanf("%d",&n); long long a[MAXN],sum=0,cnt[2*MAXN]={0}; for(int i=0;i<n;i++) { scanf("%lld", &a[i]); sum += a[i]; cnt[a[i]+MAXN]++; } // 计算前缀和 for (int j = 1; j < 2 * MAXN; ++j){ cnt[j]+=cnt[j-1]; } double res=-1,ans; for(long long k=sum/n;k<=sum/(double)n+(n%sum!=0);k++){ ans=(long long)(n*(k-(sum/n)))-((k>sum/n)?(cnt[(int)((k)*n-sum)+MAXN]):0)+(cnt[MAXN+k*n-sum]-cnt[k*n-MAXN]); if(res==-1||res>ans){res=ans;} } printf("%.0lf\n",res); return 0; } ``` 上述代码片段展示了如何运用前缀和技巧解决问题的一个实例。 #### 三、实战演练策略 考虑到实际比赛环境下的时间压力和技术难度,推荐按照以下方式制定个人化的训练计划: - **初级阶段**:完成约50至70道简单级别的习,主要覆盖基本概念理解和编码能力提升方面。 - **中级阶段**:继续攻克大约80到100道中等复杂度的任务项目,着重强化对各类经典算法模型的应用技能。 - **高级阶段**:最后冲刺期间可尝试解答不少于30道高阶难案例研究分析报告撰写等工作内容[^3]。 综上所述,对于希望参与蓝桥杯赛事并通过初赛甚至更进一步取得优异成绩的学习者而言,总计需积累不低于两百次的有效实践经历作为底线标准较为合适。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值