蓝桥杯试题:区间次方和(前缀和)

server/2025/2/25 7:45:47/

活动发起人@小虚竹 想对你说:

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!

提醒:在发布作品前,请将不需要的内容删除。

一、问题描述

给定一个长度为 nn 的整数数组 aa 以及 mm 个查询。

每个查询包含三个整数 l,r,kl,r,k 表示询问 l∼rl∼r 之间所有元素的 kk 次方和。

请对每个查询输出一个答案,答案对 109+7109+7 取模。

输入格式

第一行输入两个整数 n,mn,m 其含义如上所述。

第二行输入 nn 个整数 a[1],a[2],...,a[n]a[1],a[2],...,a[n]。

接下来 mm 行,每行输入三个整数 l,r,kl,r,k 表示一个查询。

输出格式

输出 mm 行,每行一个整数,表示查询的答案对 109+7109+7 取模的结果。

样例输入

5 3
1 2 3 4 5
1 3 2
2 4 3
3 5 1

样例输出

14
99
12

二、前缀和算法

1. 前缀和的定义

        给定一个数组 nums,其前缀和数组 prefix 的第 i 项表示原数组前 i 个元素的和(从第 0 个到第 i-1 个元素)。

· 特点:前缀和数组的长度比原数组多 1,且首项 prefix[0] = 0。

2. 核心作用

· 快速计算区间和:若需计算原数组 nums[a..b] 的和(闭区间),只需 prefix[b+1] - prefix[a]

· 时间复杂度优化:预处理阶段为 O(n),单次查询区间和的时间降为 O(1)

3. Java代码示例

java">public class PrefixSumExample {public static void main(String[] args) {int[] nums = {1, 2, 3, 4, 5};int[] prefix = computePrefixSum(nums);// 输出前缀和数组:[0, 1, 3, 6, 10, 15]System.out.println(java.util.Arrays.toString(prefix));// 计算区间和 [1..3] (原数组元素 2+3+4=9)int sum = getRangeSum(prefix, 1, 3);System.out.println("Sum of nums[1..3]: " + sum); // 输出 9}/*** 计算前缀和数组* @param nums 原始数组* @return 前缀和数组,长度为 nums.length + 1*/public static int[] computePrefixSum(int[] nums) {int n = nums.length;int[] prefix = new int[n + 1];for (int i = 0; i < n; i++) {prefix[i + 1] = prefix[i] + nums[i];}return prefix;}/*** 通过前缀和数组快速计算区间和 [a, b]* @param prefix 前缀和数组* @param a 区间起始索引(原数组)* @param b 区间结束索引(原数组)* @return 区间和*/public static int getRangeSum(int[] prefix, int a, int b) {return prefix[b + 1] - prefix[a];}
}

4. 应用场景

1. 多次区间和查询:如统计数组中多个子数组的总和。

2. 滑动窗口问题:配合双指针技术快速计算窗口内元素的和。

3. 动态规划:作为状态转移的基础,例如最长连续子数组和问题。

二、试题代码展示

java">import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int n = scan.nextInt();int m = scan.nextInt();int[] a = new int[n];for(int i = 0 ; i < n ;i++){a[i]  = scan.nextInt();}long mod = (long)1e9 + 7;long[][] sum = new  long[6][n + 1];  //sum[i][j]代表前j个元素的i次方和//计算前缀和,k从1--5(假设 + 避免超时 + 符合实际)for(int i = 1 ; i < 6 ; i++){for(int j = 1 ; j <= n ; j++){sum[i][j] = sum[i][j - 1] + (long)Math.pow(a[j-1] , i);}}for(int i = 0; i < m ; i++){int l = scan.nextInt() - 1;int r = scan.nextInt() - 1;int k = scan.nextInt();long ans = sum[k][r + 1] + mod -sum[k][l]; //加末端取模 保证结果为正ans %= mod;System.out.println(ans);}scan.close();}
}


http://www.ppmy.cn/server/170509.html

相关文章

哈希表入门到精通:从原理到 Python 实现全解析

系列文章目录 01-从零开始掌握Python数据结构&#xff1a;提升代码效率的必备技能&#xff01; 02-算法复杂度全解析&#xff1a;时间与空间复杂度优化秘籍 03-线性数据结构解密&#xff1a;数组的定义、操作与实际应用 04-深入浅出链表&#xff1a;Python实现与应用全面解析 …

证券相关知识

证券市场分为发行市场&#xff08;Primary Market・プライマリーマーケット&#xff09;和流通市场&#xff08;Secondary Market・セカンダリーマーケット&#xff09; 股票&#xff0c;企业筹集资金的手段之一。英语中叫做“Stock”&#xff0c;有储蓄的意思&#xff0c;是与…

【网络安全】常见的web攻击

1、SQL注入攻击 定义&#xff1a; 攻击者在HTTP请求中注入恶意的SQL代码&#xff0c;当服务器利用参数构建SQL语句的时候&#xff0c;恶意的SQL代码被一起构建,并在数据库中执行。 示例&#xff1a; 用户登录&#xff1a; 输入用户名xx&#xff0c; 密码 or 1 …

游戏引擎学习第107天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中&#xff0c;讨论了如何处理游戏中的三维效果&#xff0c;特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型&#xff0c;因此实现三维效果变得非常具有挑战性。虽然可…

23种设计模式 - 工厂方法模式

模式定义 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;定义用于创建对象的接口&#xff0c;让子类决定实例化哪个类&#xff0c;从而将对象创建过程延迟到子类。其核心目的是解耦对象的创建与使用&#xff0c;增强系统的扩展…

基金基础知识

一、基金的本质与价值 定义&#xff1a; 基金是通过集合投资者资金&#xff0c;由专业管理人&#xff08;基金经理&#xff09;进行多元化投资&#xff08;如股票、债券等&#xff09;的金融工具&#xff0c;收益按持有份额分配。 核心优势&#xff1a; 分散风险&#xff1a;…

Hot100 动态规划

动态规划 动规五部曲&#xff1a; 确定dp数组以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 爬到第一层楼梯有一种方法&#xff0c;爬到二层楼梯有两种方法。 那么第一层楼梯再跨两步就到第三…

Linux系统安装MySQL5.7(其他版本类似)避坑指南

1.远程连接 在Linux系统安装好MySQL5.7数据库&#xff0c;不要以为就大功告成了后面还有大坑等着你踩了。宏哥这里介绍一下远程连接遇到的坑以及如何处理。由于征文要求安装环境教学除外宏哥这里就不介绍在Linux系统安装mysql数据库&#xff0c;有需要的可以自己百度一下。但是…