题解:蓝桥云课 3382 区间次方和
【题目来源】
蓝桥云课:1.区间次方和 - 蓝桥云课 (lanqiao.cn)
【题目描述】
给定一个长度为n的整数数组a以及m个查询。
每个查询包含三个整数l,r,k表示询问l~个之间所有元素的k次方和。
请对每个查询输出一个答案,答案对10^9+7取模。
【输入】
第一行输入两个整数n,m其含义如上所述。
第二行输入n个整数a[1],a[2],...,a[n].
接下来m行,每行输入三个整数l,r,k表示一个查询。
【输出】
输出m行,每行一个整数,表示查询的答案对10^9+7取模的结果。
【输入样例】
5 3
1 2 3 4 5
1 3 2
2 4 3
3 5 1
【输出样例】
14
99
12
【算法标签】
《蓝桥云课 3382 区间次方和》 #前缀和#
【代码详解】
#求出a的前缀和:
from itertools import accumulate
MOD = 1000000007
#求出a的前缀和:
def get_presum(a):
sum = list(accumulate(a))
sum = [x % MOD for x in sum]
return sum
#快速求区间a[l]+...+a[r]之和
def get_sum(sum, l, r):
if l==0:
return sum[r]
else:
return (sum[r] - sum[l-1] + MOD) % MOD
n, m = map(int, input().split())
a = list(map(int, input().split()))
#存储a数组的前缀和、a数组平方的前缀和、...
sum_list = []
for i in range(1, 6):
tmp_a = [x ** i for x in a]
sum_list.append(get_presum(tmp_a))
for _ in range(m):
l, r, k = map(int, input().split())
print(get_sum(sum_list[k-1], l-1, r-1))
【运行结果】
5 3
1 2 3 4 5
1 3 2
14
2 4 3
99
3 5 1
12
浙公网安备 33010602011771号