列表

详情


NC225632. 智乃酱的区间乘积

描述

给定一个长度大小为的正整数数组,查询轮,每次问一个区间所有元素的连续乘积。
由于这个答案可能很大,你只用输出结果对取余数后的结果即可。

输入描述

第一行输入一个正整数表示数组的长度和查询的次数。
接下来输入一行个正整数表示数组的值。

输出描述

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

示例1

输入:

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

输出:

1800
6
360

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 256ms, 内存消耗: 2168K, 提交时间: 2022-02-09 17:38:37

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll mod=1e9+7;
ll k[100002];
ll qsm(ll a,ll b)
{ll ans=1;
while(b)
{if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int main()
{int n,m;
cin>>n>>m;
int x;
k[0]=1;
for(int i=1;i<=n;i++)
{cin>>x;
 k[i]=k[i-1]*x%mod;
}
while(m--)
{int a,b;
cin>>a>>b;
cout<<k[b]*qsm(k[a-1],mod-2)%mod<<endl;
}
return 0;
 } 

Python3 解法, 执行用时: 1343ms, 内存消耗: 16976K, 提交时间: 2023-05-22 21:11:25

N,M = map(int, input().split())
L = list(map(int, input().split()))
MOD = 10**9+7
prefix_product = [1] * (N+1)
for i in range(1, N+1):
    prefix_product[i] = prefix_product[i-1] * L[i-1] % MOD

for i in range(M):
    l,r = map(int, input().split())
    ans = (prefix_product[r] * pow(prefix_product[l-1], MOD-2, MOD)) % MOD
    print(ans)

上一题