题解
题面描述
给定一个由n个整数组成的数组{a1,a2,…,an}。小苯对数组中各个区间的乘积很感兴趣,并提出了q个询问:对于每个询问给定一个长度len,要求计算数组中所有长度为len的区间的乘积之和,定义区间(l,r)的乘积为
f(l,r)=al×al+1×⋯×ar
但有个特殊要求:如果某个区间的乘积f(l,r)>109,则直接将其视为0(不计入总和)。
题目内容
小苯有一个由n个整数组成的数组{a1,a2,..,an},他对数组的乘积非常感兴趣,因此他提出了q次询问,具体地,每次询问:
- 小苯会询问一个数字len,他想知道数组中所有长度为len的区间的乘积之和(形式化的:定义f(l,r)=al×al+1×...×ar,则对于所有1≤l≤r≤n,r−l+1=len的(l,r),求 f(l,r) 之和。)
但特别的,懒惰的小苯不希望处理太大的乘积,因此如果某个f(l,r)>109,则小苯会直接舍弃此值,即将其视为0
输入描述
每个测试文件均包含多组测试数据。第一行输入一个整数T(1≦T≦103) 代表数据组数,每组测试数据描述如下:
第一行输入两个正整数n,q(1≦n,q≦3×105),分别表示数组a的长度和小苯的询问次数。
第二行输入n个整数a1,a2,…,an(0≦a≦109),表示小苯拥有的a数组。
接下来q行,每行一个整数len(1≦len≦n),表示当前次的询问。
除此之外,保证单个测试文件的n之和不超过3×105,q之和不超过3×105。
输出描述
对于每组测试数据,输出q行,每行一个整数,表示对应询问的答案。
样例1
输入
1
5 2
1 2 2 1 2
1
3
输出
8
12
说明
对于第一组测试数据的第一次询问,长度为1的区间有5个,乘积之和为
f(1,1)+f(2,2)+f(3,3)+f(4,4)+f(5,5)=1+2+2+1+2=8
对于第一组测试数据的第二次询问,长度为3的区间有3个,乘积之和为
f(1,3)+f(2,4)+f(3,5)=1×2×2+2×1×2+2×2×1=12