【数据结构-前缀和】【二进制】力扣.2438. 二的幂数组中查询范围内的乘积

给你一个正整数 n ,你需要找到一个下标从 0 开始的数组 powers ,它包含 最少 数目的 2 的幂,且它们的和为 n 。powers 数组是 非递减 顺序的。根据前面描述,构造 powers 数组的方法是唯一的。

同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] ,其中 queries[i] 表示请你求出满足 lefti <= j <= righti 的所有 powers[j] 的乘积。

请你返回一个数组 answers ,长度与 queries 的长度相同,其中 answers[i]是第 i 个查询的答案。由于查询的结果可能非常大,请你将每个 answers[i] 都对 109 + 7 取余 。

示例 1:

输入:n = 15, queries = [[0,1],[2,2],[0,3]]

输出:[2,4,64]

解释:

对于 n = 15 ,得到 powers = [1,2,4,8] 。没法得到元素数目更少的数组。

第 1 个查询的答案:powers[0] * powers[1] = 1 * 2 = 2 。

第 2 个查询的答案:powers[2] = 4 。

第 3 个查询的答案:powers[0] * powers[1] * powers[2] * powers[3] = 1 * 2 * 4 * 8 = 64 。

每个答案对 109 + 7 得到的结果都相同,所以返回 [2,4,64] 。

示例 2:

输入:n = 2, queries = [[0,0]]

输出:[2]

解释:

对于 n = 2, powers = [2] 。

唯一一个查询的答案是 powers[0] = 2 。答案对 109 + 7 取余后结果相同,所以返回 [2] 。

cpp 复制代码
class Solution {
public:
    vector<int> productQueries(int n, vector<vector<int>>& queries) {
        vector<int> powers;
        while(n > 0){
            int lowbit = n & (-n);
            powers.push_back(lowbit);
            n ^= lowbit;
        }

        const int MOD = 1e9 + 7;
        vector<int> answers;
        for(const auto& query : queries){
            long long count = 1;
            for(int i = query[0];i <= query[1];i++){
                count = count * powers[i] % MOD;
            }
            answers.push_back(count);
        }
        return answers;
    }
};

这道题目的难点就是如何计算出powers数组,

cpp 复制代码
 while(n > 0){
            int lowbit = n & (-n);
            powers.push_back(lowbit);
            n ^= lowbit;
        }

这运用到了二进制的知识,比如n为20整数, 它的二进制为10100,那么他的反码~n = 01011,补码为反码+1,也就是 ~n + 1 = 01100,这时候取n和他的补码的与,可以得到 10100 & 01100 = 00100。这就是整数4,然后将n减去或者异或掉00100,也就是10100 - 00100 = 10000,或者说是 10100 ^ 00100 = 10000,可知10000的整数是16,所以20这个数的power就是{4,16}。接下来计算queries每个区间对应的值push_back到返回到answer中即可。

相关推荐
小龙报3 分钟前
【算法通关指南:算法基础篇(三)】一维差分专题:1.【模板】差分 2.海底高铁
android·c语言·数据结构·c++·算法·leetcode·visual studio
小白程序员成长日记8 分钟前
2025.12.07 力扣每日一题
算法·leetcode·职场和发展
小李小李快乐不已17 分钟前
图论理论基础(5)
数据结构·c++·算法·机器学习·动态规划·图论
民乐团扒谱机20 分钟前
【微实验】大规模网络的社区检测Clauset–Newman–Moore聚类算法(附完整MATLAB代码)
算法·matlab·聚类·聚类算法·cnm·语义
烛衔溟20 分钟前
C语言图论:有向图基础
c语言·数据结构·图论·有向图
4***997425 分钟前
工业网关助力Altivar320与S7-1200协同运行
ide·python·算法·spring·eclipse·sqlite·tornado
IT·小灰灰26 分钟前
DeepSeek-V3.2:开源大模型的里程碑式突破与硅基流动平台实战指南
大数据·人工智能·python·深度学习·算法·数据挖掘·开源
AI视觉网奇9 小时前
Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr
开发语言·c++·算法
ghie90909 小时前
ECG波形检查与分析系统
算法
智者知已应修善业9 小时前
【输入两个数字,判断两数相乘是否等于各自逆序数相乘】2023-10-24
c语言·c++·经验分享·笔记·算法·1024程序员节