题目是离线区间查询,想到使用前缀和比较合适。对于区间[l,r]的所有ai乘积,若暂不考虑取模,它的值应该等于区间[1,r]的所有ai乘积除以[1,l-1]的所有ai乘积即pre[r]/pre[l-1]。故预处理pre[i]表示前i个数相乘并模1E9+7的值。由于此题需要对1E9+7取模,因此查询时的除法应使用逆元来计算,可以使用快速幂求逆元。
#include <iostream>
#include <vector>
constexpr int P = 1E9+7;
int quickPower(int a,int b){
int res = 1;
for(; b; a=1LL*a*a%P,b>>=1){
if(b & 1){
res = 1LL*res*a%P;
}
}
return res;
}
int inv(int a){
return quickPower(a,P-2);
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int n,q;
std::cin >> n >> q;
std::vector<int> a(n+1);
for(int i = 1; i <= n; i++){
std::cin >> a[i];
}
std::vector<int> pre(n+1);
pre[0] = 1;
for(int i = 1; i <= n; i++){
pre[i] = 1LL*pre[i-1]*a[i]%P;
}
for(int qi = 0; qi < q; qi++){
int l,r;
std::cin >> l >> r;
std::cout << 1LL*pre[r]*inv(pre[l-1])%P << " \n"[qi+1==q];
}
}

京公网安备 11010502036488号