题目:2438. 二的幂数组中查询范围内的乘积


思路:位运算,时间复杂度 O(m + log n * log n)。
C++ 版本:
class Solution {
public:
vector<int> productQueries(int n, vector<vector<int>>& queries) {
int mod = 1000000007;
// 得到元素 n 二进制形式的数组
vector<int> v;
while (n != 0) {
// n&-n 得到的是 n 的最低位
v.push_back(n & -n);
n ^= (n & -n);
}
int m = v.size();
// 预处理出所有可能的范围,时间复杂度 O(log n * log n)
vector<vector<int>> f(m + 1, vector<int>(m + 1, 1));
for (int i = 1; i <= m; i++) {
f[i][i] = v[i - 1];
for (int j = i + 1; j <= m; j++) {
f[i][j] = ( * f[i][j - ] * v[j - ]) % mod;
}
}
vector<> ans;
( query : queries) {
ans.(f[query[] + ][query[] + ]);
}
ans;
}
};

