题意:离线求区间乘积,直接处理前缀乘积就可以啦,不过要注意逆元
参考代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define x first
#define y second
typedef pair<int,int>PII;
int max(int a,int b)
{
if(a>=b) return a;
else return b;
}
int min(int a,int b)
{
if(a>=b) return b;
else return a;
}
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
int qmi(int a,int b,int c)
{
int res=1%c;
while(b)
{
if(b&1) res=res*a%c;
a=a*a%c;
b>>=1;
}
return res;
}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
const int mod=1e9+7;
const int N=1e5+10;
int s[N];
void solve()
{
s[0]=1;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int k;
cin>>k;
s[i]=s[i-1]*k%mod;
//cout<<s[i]<<endl;
}
while(m--)
{
int l,r;
cin>>l>>r;
int ans=s[r]*qmi(s[l-1],mod-2,mod)%mod;
cout<<ans<<endl;
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int t;
t=1;
while(t--)
{
solve();
}
return 0;
}