自用记录 链接暂不公开
给定一个长度大小为N的正整数数组,查询M轮,每次问一个区间所有元素的连续乘积。
由于这个答案可能很大,你只用输出结果对1e9+7取余数后的结果即可。
#pragma otimize("O2")
#include<bits/stdc++.h>
using i64 = long long;
constexpr int p = 1e9 + 7;
i64 quick_power(i64 a, i64 b, i64 p) {
if (b == 0) return 1 % p;
auto ns = quick_power(a, b >> 1, p);
ns = ns * ns % p;
if (b & 1) ns = ns * a % p;
return ns;
}
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<i64> a(n + 1);
for (int i = 1; i <= n; ++i) std::cin >> a[i];
std::vector<i64> s(n + 1);
s.front() = 1;
for (int i = 1; i <= n; ++i) s[i] = (a[i] * s[i - 1]) % p;
for (int i = 1; i <= m; ++i) {
int l, r;
std::cin >> l >> r;
std::cout << s[r] * quick_power(s[l - 1], p - 2, p) % p<< '\n';
}
}
auto main() -> signed {
std::cin.tie(nullptr)->sync_with_stdio(false);
std::cout << std::fixed << std::setprecision(2);
solve();
return 0;
}