2017蓝桥杯省赛---java---B---10(k倍区间)

该博客介绍了一种算法问题,即在给定的数列中寻找所有和为K的倍数的连续子序列(K倍区间)。通过计算每个位置的前缀和并使用哈希映射统计每个前缀和出现的次数,可以有效地计算出满足条件的区间数量。程序的时间复杂度为O(N),满足题目资源约束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

标题: k倍区间

给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1,Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。

你能求出数列中总共有多少个K倍区间吗?

输入 
第一行包含两个整数N和K。(1 <= N, K <= 100000) 
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)

输出 
输出一个整数,代表K倍区间的数目。

例如, 
输入: 
5 2 
1 
2 
3 
4 
5

程序应该输出: 
6

资源约定: 
峰值内存消耗(含虚拟机) < 256M 
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

思路分析

可以解决10e4
在这里插入图片描述
在这里插入图片描述

代码实现

package lanqiao;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static int n,k;
    public static int[] a;
    public static int[] s;//前缀和
    public static Map<Integer,Long> cnt=new HashMap<>();//相同余数的个数统计
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n=scanner.nextInt();
        k=scanner.nextInt();
        a=new int[n+1];
        s=new int[n+1];
        s[0]=0;
        cnt.put(0,1L);
        for (int i = 1; i <= n; i++) {//表示第几个数字
            a[i]=scanner.nextInt();
            s[i]=(s[i-1]+a[i])%k;
            if(cnt.get(s[i])==null){
                cnt.put(s[i],1L);
            }else {
                cnt.put(s[i],cnt.get(s[i])+1);
            }
        }
        long ans=0;
        for (int i = 0; i < k; i++) {//余数必然在0~k-1之间
            Long cntI=cnt.get(i);
            if (cntI==null){
                cntI=0L;
            }
            ans+=cntI*(cntI-1)/2;//他们两两之间可以结合Cn2
        }
        System.out.println(ans);
    }

}

在这里插入图片描述

### 关于2023年蓝桥杯C++ C组的信息 目前可获取到的关于2023年第十四届蓝桥杯的具体题目和解题报告主要集中在A组和B组,而针对C组的内容较少公开发布。以下是基于现有资料整理的部分信息以及可能涉及的知识点。 #### 已知信息概述 根据已有的参考资料[^1]、[^2],可以确认的是2023年的蓝桥杯确实存在多个分组(如A组、B组),并提供了部分真题及其解析。然而对于C组的具体题目尚未有完整的官方文档或广泛传播的学习资源可供查阅。因此以下内容更多是从其他相近组别的考察方向推测而来: - **基础算法**:包括但不限于排序、查找等基本操作的应用场景扩展。 - **数据结构入门级应用**:链表的操作、栈队列的基础运用等问题形式较为常见。 - **简单数学模型构建能力测试**:例如最大公约数最小公数计算、素数判断等相关知识点会被频繁提及。 #### 可能覆盖的主要技术领域 ##### 平方差问题探讨 此类问题是通过给定两个整数a,b来求取它们之间所有完全平方数值总和减去非完全平方数值之差的结果展示。此过程涉及到循环遍历区间内的每一个数字判定其是否属于完美平方数范畴进而累加或者扣除相应值完成最终运算得到答案。 ```python import math def square_difference(a, b): sum_squares = 0 other_sum = 0 start = min(a, b) end = max(a, b) for num in range(start, end + 1): root = int(math.sqrt(num)) if root * root == num: sum_squares += num else: other_sum += num return abs(sum_squares - other_sum) result = square_difference(3,7) print(result) # 输出结果应为具体数值表示两者差异程度大小关系 ``` ##### 更小的数统计方法研究 该类题目通常要求参者能够快速有效地找出数组中满足特定条件的小于某个阈值k的所有元素数量。这不仅考验选手们对线性扫描技巧掌握情况同时也对其优化思维提出了挑战。 ```c++ #include <bits/stdc++.h> using namespace std; int count_smaller(vector<int>& nums,int k){ int cnt=0; for(auto &num :nums ){ if (num<k) ++cnt; } return cnt; } // 测试函数调用逻辑实现细节略... ``` ##### 动态规划初步接触——以买瓜为例说明状态转移方程设计原则 动态规划作为解决多阶段决策过程中最优策略选取的有效工具,在竞编程里占据重要地位。下面将以“买瓜”这一经典案例阐述如何定义子问题建立递推关系从而达到全局最优点的目的[^3]。 假设每种类型的西瓜都有固定价格p_i及重量w_i,现在顾客手里持有金额m元想要购买尽可能重的一批商品回家享用,则可以通过如下方式设定dp[j]代表当剩余钱数恰好等于j时所能携带的最大货物质量是多少? 初始状态下令所有的dp[]均为负无穷大(-INF),唯有dp[0]=0因为没有任何花费情况下显然无法带走任何东西;接着按照顺序逐一考虑各个品种加入购物清单后的变化影响直至处理完毕全部选项为止最后返回dp[m]即为我们所寻找的目标解答之一。 ```java public class MelonBuying { public static final int INF = Integer.MIN_VALUE / 2 ; public static int getMaxWeight(int m , List<Pair<Integer,Integer>> melons){ int n = melons.size(); // 初始化 dp 数组长度设为 m+1 方便索引访问 int [] dp=new int [m+1]; Arrays.fill(dp,INF); dp[0]=0; for(Pair<Integer,Integer> pair:melons){ int pi=pair.getKey(),wi=pair.getValue(); for(int j=m;j>=pi;--j){ dp[j]=Math.max(dp[j],dp[j-pi]+wi); } } // 找到最后一个有效位置对应的值就是答案 for(int i=m;i>=0;--i){ if(dp[i]!=INF)return i; } return 0;//理论上不会执行到这里除非输入异常 } } ``` #### 结论 由于缺乏直接面向C组的确切描述材料,上述分析仅能依据相似难度层次下的命题规律做出合理猜测。建议关注后续事主办方发布的正式版指南文件以便及时了解最新动向调整复习计划安排。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Frank---7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值