洛谷t221263

题目背景

前缀计算

题目描述

给定长度为�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;
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值