力扣2438. 二的幂数组中查询范围内的乘积

这一题又是在区间查询,一般是要用前缀和的,我刚开始的思路也是在用前缀和来解决,但出现的问题是因为数据过大,而这一题求的是前缀乘积,那么必须%1000000007,可是当用前缀乘积来得到查询结果的时候,会出现除法,而无法在进行模运算后进行除法运算,需要用一个逆元除法,这超出了我学习算法的范围,故放弃这种方法。

c++ 复制代码
class Solution {
public:
    long long sum[100005];
 vector<int> productQueries(int n, vector<vector<int>>& queries) {
    
	
	 
	 //构建成功powers数组
	 //那么
	 
	 vector<int> powers;
	 for (int i = 0; n > 0; i++) {
            if (n & 1) powers.push_back(1 << i);
            n >>= 1;
    }
	 vector<int> ans;
	 sum[0]=1;
	 for(int i=0;i<powers.size();i++)
	 {
	      sum[i+1]=(sum[i]%1000000007*powers[i]%1000000007)%1000000007;	
	 }
	 for(int i=0;i<queries.size();i++)
	 {
	      int l=queries[i][0];
		  int r=queries[i][1];	
		  ans.push_back((sum[r+1]/sum[l]));
	 } 
	 
	 return ans;
       
    }
};

实际上因为n是小于10^9的,那么powers数组中的元素最多大概也就30个,因此我们可以直接选择暴力的写法。

而这一道题的另一个关键点,就是在于如何得到powers数组,也即如何让一个数n分解成包含 最少 数目的 2 的幂,且它们的和为 n 。

我们只需将这个数写成二进制的形式即可,比如 100101,只需把为1的二进制的次幂提取出来即可

而对一个数的二进制的处理,需要掌握好位运算,就能很好的解决。

按位与,左移,右移运算解析

c++ 复制代码
 vector<int> powers;
	 for (int i = 0; n > 0; i++) {
            if (n & 1) powers.push_back(1 << i);
            n >>= 1;
    }

得到powers数组后,暴力模拟即可

最终代码如下:

c++ 复制代码
class Solution {
public:
  
 vector<int> productQueries(int n, vector<vector<int>>& queries) {
    
	
	 
	 //构建成功powers数组
	 //那么
	 
	 vector<int> powers;
	 for (int i = 0; n > 0; ++i) {
            if (n & 1) powers.push_back(1 << i);
            n >>= 1;
    }
     //因为n=10^9,所以power最多有30个元素
	 //那么我们可以直接用暴力写 
	 vector<int> ans;


	 for(int i=0;i<queries.size();i++)
	 {
	 	long long x=1;
	      int l=queries[i][0];
		  int r=queries[i][1];	
		 for(int j=l;j<=r;j++)
		 {
		    	x=(x%1000000007*powers[j]%1000000007)%1000000007;
		 } 
		 ans.push_back(x);
	 } 
	 
	 return ans;
       
    }
};

时间复杂度大概O(30^n)。

相关推荐
c238561 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa2 小时前
指针之总结
c语言·笔记·算法
宵时待雨2 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz2 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2162 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp3 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238563 小时前
C/C++每日一练6
c语言·c++·算法
AI小码4 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
KaMeidebaby5 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao5 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode