给定arr和Q查询中的算术级数,其形式为[L,R] ,其中L是范围的左边界, R是右边界。任务是在给定范围内找到AP元素的总和。
注意:范围为1分度,且1≤L,R≤N,其中N是arr的大小。
例子:
Input: arr[] = {2, 4, 6, 8, 10, 12, 14, 16}, Q = [[2, 4], [2, 6], [5, 8]]
Output:
18
40
52
Explanation:
Range 1: arr = {4, 6, 8}. Therefore sum = 18
Range 2: arr = {4, 6, 8, 10, 12}. Therefore sum = 40
Range 3: arr = {10, 12, 14, 16}. Therefore sum = 52
Input: arr[] = {7, 14, 21, 28, 35, 42}, Q = [[1, 6], [2, 4], [3, 3]]
Output:
147
63
21
Explanation:
Range 1: arr = {7, 14, 21, 28, 35, 42}. Therefore sum = 147
Range 2: arr = {14, 21, 28}. Therefore sum = 63
Range 3: arr = {21}. Therefore sum = 21
方法:由于给定的序列是算术级数,因此可以很容易地分两步轻松地求出和:
- 将范围的第一个元素乘以范围中的元素数。
- 在其上加上(d * k *(k + 1))/ 2 ,其中d是AP的共同差异,而k是(间隙数– 1内的元素数),它对应于间隙数。
例如:
假设a [i]是该范围的第一个元素, d是AP的公共差,而k + 1是给定范围内的元素数。
则范围的总和为
= a[i] + a[i+1] + a[i+2] + ….. + a[i+k]
= a[i] + a[i] + d + a[i] + 2 * d + …. + a[i] + k * d
= a[i] * (k + 1) + d * (1 + 2 + … + k)
= a[i] * (k + 1) + (d * k * (k+1))/2
下面是上述方法的实现:
CPP
// C++ program to find the sum of elements
// of an AP in the given range
#include
using namespace std;
// Function to find sum in the given range
int findSum(int* arr, int n,
int left, int right)
{
// Find the value of k
int k = right - left;
// Find the common difference
int d = arr[1] - arr[0];
// Find the sum
int ans = arr[left - 1] * (k + 1);
ans = ans + (d * (k * (k + 1))) / 2;
return ans;
}
// Driver code
int main()
{
int arr[] = { 2, 4, 6, 8, 10, 12, 14, 16 };
int queries = 3;
int q[queries][2] = { { 2, 4 },
{ 2, 6 },
{ 5, 6 } };
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < queries; i++)
cout << findSum(arr, n, q[i][0], q[i][1])
<< endl;
}
Java
// Java program to find the sum of elements
// of an AP in the given range
class GFG{
// Function to find sum in the given range
static int findSum(int []arr, int n,
int left, int right)
{
// Find the value of k
int k = right - left;
// Find the common difference
int d = arr[1] - arr[0];
// Find the sum
int ans = arr[left - 1] * (k + 1);
ans = ans + (d * (k * (k + 1))) / 2;
return ans;
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 2, 4, 6, 8, 10, 12, 14, 16 };
int queries = 3;
int q[][] = { { 2, 4 },
{ 2, 6 },
{ 5, 6 } };
int n = arr.length;
for (int i = 0; i < queries; i++)
System.out.print(findSum(arr, n, q[i][0], q[i][1])
+"\n");
}
}
// This code is contributed by Princi Singh
Python3
# Python program to find the sum of elements
# of an AP in the given range
# Function to find sum in the given range
def findSum(arr, n, left, right):
# Find the value of k
k = right - left;
# Find the common difference
d = arr[1] - arr[0];
# Find the sum
ans = arr[left - 1] * (k + 1);
ans = ans + (d * (k * (k + 1))) // 2;
return ans;
# Driver code
if __name__ == '__main__':
arr = [ 2, 4, 6, 8, 10, 12, 14, 16 ];
queries = 3;
q = [[ 2, 4 ],[ 2, 6 ],[ 5, 6 ]];
n = len(arr);
for i in range(queries):
print(findSum(arr, n, q[i][0], q[i][1]));
# This code is contributed by sapnasingh4991
C#
// C# program to find the sum of elements
// of an AP in the given range
using System;
class GFG{
// Function to find sum in the given range
static int findSum(int []arr, int n,
int left, int right)
{
// Find the value of k
int k = right - left;
// Find the common difference
int d = arr[1] - arr[0];
// Find the sum
int ans = arr[left - 1] * (k + 1);
ans = ans + (d * (k * (k + 1))) / 2;
return ans;
}
// Driver code
public static void Main(String[] args)
{
int []arr = { 2, 4, 6, 8, 10, 12, 14, 16 };
int queries = 3;
int [,]q = { { 2, 4 },
{ 2, 6 },
{ 5, 6 } };
int n = arr.Length;
for (int i = 0; i < queries; i++)
Console.Write(findSum(arr, n, q[i,0], q[i,1])
+"\n");
}
}
// This code is contributed by PrinciRaj1992
18
40
22
时间复杂度: O(1)
空间复杂度: O(1)