A.智乃酱的区间乘积

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

给定一个长度大小为N的正整数数组,查询M轮,每次问一个区间所有元素的连续乘积。

由于这个答案可能很大,你只用输出结果对10e9+7取余数后的结果即可。

输入描述:

第一行输入一个正整数N,M(1≤N,M≤1e5)表示数组的长度和查询的次数。

接下来输入一行N个正整数ai 1≤ai≤10e9表示数组的值。

输出描述:

请输出一个非负整数,表示区间所有数字的连续乘积对10e9+7取余数后的结果。

示例1

输入

5 3 5 2 3 10 6 1 5 2 3 2 5

5 3
5 2 3 10 6
1 5
2 3
2 5

输出

1800 6 360

1800
6
360

备注:

注意要取模。整数加、减、乘可直接做,除要考虑逆元

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
long long ksm(long long a,int b){
    long long sum = 1;
    while(b){
        if(b & 1){
            sum = (sum * a) % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return sum;
}
void solve(){
    int n,m;
    cin >> n >> m;
    long long a[100010];
    long long b[100010];
    b[0] = 1;
    b[1] = 1;
    for(int i = 1;i <= n;i ++){
        cin >> a[i];
        b[i] = b[i - 1] * a[i] % mod;
    }
    while(m --){
        int l,r;
        cin >> l >> r;
        cout << b[r] * ksm(b[l - 1],mod - 2) % mod<< endl;
    }
    return;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值