题目背景
前缀计算
题目描述
给定长度为�n的整数数列��ai。
然后进行�t次询问,每次给定区间的左右边界�l、�r,求区间内整数的积,即��×��+1×⋯×��−1×��al×al+1×⋯×ar−1×ar。
输出对109+7109+7取模后的结果。
输入格式
第一行包含两个正整数�n、�t。
第二行包含�n个正整数��ai。
接下来�t行,每行包含两个正整数�l、�r。
输出格式
对于每个询问输出一行,包含一个正整数。
输入输出样例
输入 #1复制
5 5 1 2 3 4 5 1 2 2 3 1 5 3 5 2 5
输出 #1复制
2 6 120 60 120
说明/提示
对于30%的数据,1≤�、�≤101≤n、t≤10,1≤��≤101≤ai≤10。
对于100%的数据,1≤�、�≤1051≤n、t≤105,1≤��≤1091≤ai≤109,1≤�≤�≤�1≤l≤r≤n。
#include<bits/stdc++.h>
using namespace std;
const int kn=1e9+7;
long long qpow(int p,int q){
if(q==0){
return 1;
}
if(q%2==0){
long long t=qpow(p,q/2);
return t*t%kn;
}
if(q%2==1){
return qpow(p,q-1)*p%kn;
}
}
int main(){
int a[100005],n,t,l,r;
long long s[100005];
s[0]=1;
cin>>n>>t;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]*a[i]%kn;
}
for(int i=1;i<=t;i++){
cin>>l>>r;
cout<<s[r]*qpow(s[l-1],kn-2)%kn<<endl;
}
}