区间乘积
https://ac.nowcoder.com/acm/contest/19483/A
前缀和版本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
const ll MOD=1e9+7;
ll pow(ll a,ll b,ll mod)
{
ll res=1;
while(b)
{
if(b&1)res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res;
}
ll get_inv(ll x)
{
return pow(x,MOD-2,MOD);
}
ll s[maxn],n;
int main()
{
int T_T;
cin>>n>>T_T;
s[0]=1;
for(int i=1;i<=n;i++)cin>>s[i];
for(int i=1;i<=n;i++)s[i]=(s[i-1]*s[i])%MOD;
while(T_T--)
{
int l,r;
cin>>l>>r;
cout<<(s[r]*get_inv(s[l-1]))%MOD<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
#define ll long long
const ll MOD=1e9+7;
struct sgt_tree
{
#define ls (u<<1)
#define rs (u<<1|1)
ll sum[maxn<<3],a[maxn];
ll mul(ll a,ll b)
{
return (a%MOD*b%MOD)%MOD;
}
void pushup(int u)
{
sum[u]=mul(sum[ls],sum[rs]);
}
void build(int u,int l,int r)
{
if(l==r)
{
sum[u]=a[l]%MOD;
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(u);
}
ll ask(int u,int l,int r,int ql,int qr)
{
if(l>qr||r<ql)return (ll)1;
if(ql<=l&&r<=qr)return sum[u];
int mid=(l+r)>>1;
return mul(ask(ls,l,mid,ql,qr),ask(rs,mid+1,r,ql,qr));
}
#undef ls
#undef rs
}sgt;
int n,m;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>sgt.a[i];
sgt.build(1,1,n);
while(m--)
{
int l,r;
cin>>l>>r;
cout<<sgt.ask(1,1,n,l,r)<<endl;
}
return 0;
}