首页 > 试题广场 >

子数列求积

[编程题]子数列求积
  • 热度指数:2532 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定一个长度为 n 的正整数序列 \{a_1,a_2,\dots ,a_n\} 。接下来有 q 次独立查询,第 j 次查询给出一对下标 l_j,r_j ,请你计算区间乘积


\prod\limits_{i=l_j}^{r_j} a_i


\hspace{15pt}并对模数 10^9+7 取模后的结果。

输入描述:
\hspace{15pt}第一行输入两个整数 n,q\left(1 \leqq n,q \leqq 10^5\right) ,分别表示序列长度与查询数量。
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots ,a_n\left(1 \leqq a_i < 10^9+7\right) ,表示序列元素。
\hspace{15pt}此后 q 行,第 j 行输入两个整数 l_j,r_j\left(1 \leqq l_j \leqq r_j \leqq n\right) ,表示一次查询的左右端点。


输出描述:
\hspace{15pt}输出一行 q 个用空格隔开的整数,第 j 个整数为第 j 次查询的答案。
示例1

输入

5 3
1 2 3 4 5
1 2
1 3
2 5

输出

2 6 120

说明

区间 [1,2] 的乘积为 1\times2=2[1,3] 的乘积为 1\times2\times3=6[2,5] 的乘积为 2\times3\times4\times5 = 120
头像 小男娘
发表于 2025-12-22 15:52:21
类似阶乘逆元预处理,预处理出所有前缀积以及前缀积逆元,然后回答每个询问,总时间复杂度。 #include <iostream> using namespace std; using ll = long long; const int MOD = 1e9 + 7; ll Pow(ll 展开全文
头像 carson_flute
发表于 2026-01-15 22:25:38
本题是经典前缀积问题。 核心思路 核心观察 定义前缀积数组 pref: pref[0] = 1 pref[i] = (a_1 \times a_2 \times \cdots \times a_i) \mod M 则区间乘积可表示为: 但 模运算中不能直接做除法! 算法步骤 前缀积表示正确 展开全文
头像 丨阿伟丨
发表于 2025-08-28 17:48:32
题目链接 子数列求积 题目描述 给定一个长度为 的正整数序列 。接下来有 次独立查询,第 次查询给出一对下标 (),请你计算区间乘积 并对模数 取模后的结果。 解题思路 本题要求我们高效地计算多次给定区间的乘积。如果对每次查询都遍历区间 进行计算,在查询次数 和区间长度都很大的情况下 展开全文
头像 此在Dasein
发表于 2026-01-13 01:13:57
算法:前缀积与逆元 鉴于序列是静态的,前缀和思想的变体——前缀积是解决该问题的最优范式。 核心逻辑 定义前缀积数组 表示从 到 的乘积。 理论上,区间 的乘积可以表示为: 在模 意义下转化为: 零值处理 为了解决 导致的“信息坍缩”和“不可逆”问题,我们需要引入双层数据结构: 非零 展开全文
头像 BeauWill
发表于 2026-01-13 01:59:19
题目是离线区间查询,想到使用前缀和比较合适。对于区间[l,r]的所有ai乘积,若暂不考虑取模,它的值应该等于区间[1,r]的所有ai乘积除以[1,l-1]的所有ai乘积即pre[r]/pre[l-1]。故预处理pre[i]表示前i个数相乘并模1E9+7的值。由于此题需要对1E9+7取模,因此查询时的 展开全文
头像 掏枪没我AC快
发表于 2026-01-13 12:28:50
//就是一个前缀乘+逆元就OK了!!! #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 1e9 + 7; const int N = 1e5 + 9; int a[N] 展开全文
头像 Silencer76
发表于 2025-07-11 14:46:44
题目链接 HIGH18 子数列求积 题目描述 给定一个长度为 的正整数序列 和 次查询。每次查询给出一对 (),要求计算子数列 的乘积,并对模数 取模。 输入描述: 第一行输入两个整数 。 第二行输入 个正整数 。 接下来 行,每行输入两个整数 。 输出描述: 输出一行,包含 个用 展开全文
头像 ddhw111
发表于 2026-01-13 21:32:37
#include<bits/stdc++.h> #define endl "\n" #define int long long using namespace std; struct node { int l, r, sum; } tree[4 * 10001 展开全文
头像 TimothyStarman
发表于 2026-01-13 09:00:03
前缀和(积) 板子题。 如果根据 次询问每一次都乘一次,复杂度为 肯定是超时的,那我们进行前缀乘积处理,若输入为 ,我们把数组第 0 位初始化为 1: 0 1 2 3 4 5 1 2 4 5 1 4 那么再使用一个前缀积数组,第 位表示 : 0 1 2 3 4 5 展开全文
头像 quchen666
发表于 2026-01-13 11:03:13
#include <bits/stdc++.h> using namespace std; const int N=3e5+10; const int mod = 1e9+7; typedef long long ll; typedef unsigned long long ull; i 展开全文