C++范围内最大奇数约数的异或查询

2023年 8月 28日 40.9k 0

C++范围内最大奇数约数的异或查询

给定一个包含 N 个整数的数组和 Q 个范围查询。对于每个查询,我们需要返回范围内每个数字的最大奇数除数的异或。

最大奇数除数是可以整除数字 N 的最大奇数,例如 。例如,6 的最大奇数约数是 3。

Input: nums[ ] = { 3, 6, 7, 10 }, query[ ] = { { 0, 2 }, { 1, 3 } }
Output:
query1: 7
query2: 1

Explanation: greatest odd divisors of nums array are { 3, 3, 7, 5 }.
For query 1 we need to find the XOR of indexes 0, 1, and 2 which is 7, and for query2 we need to find XOR of indexes 1, 2, and 3 which is 1.

登录后复制

求解的方法

简单方法

首先,在简单方法中,我们需要找到所有数组元素的最大奇数约数。然后根据查询的范围,我们需要计算范围内每个元素的异或并返回。

有效的方法

解决这个问题的一个有效方法是创建包含最大奇数除数的数组的前缀异或数组 prefix_XOR[],而不是每次对范围内的每个数字进行异或并返回 prefix_XOR[R] - prefix_XOR[L-1]。

Prefix异或数组是其中每个元素都包含所有先前元素的异或的数组。

示例

#include
using namespace std;
int main(){
int nums[] = { 3, 6, 7, 10 };
int n = sizeof(nums) / sizeof(nums[0]);
int prefix_XOR[n];
// creating an array
// containing Greatest odd divisor of each element.
for (int i = 0; i < n; i++) {
while (nums[i] % 2 != 1)
nums[i] /= 2;
prefix_XOR[i] = nums[i];
}
// changing prefix_XOR array to prefix xor array.
for (int i = 1; i < n; i++)
prefix_XOR[i] = prefix_XOR[i - 1] ^ prefix_XOR[i];
// query array to find result of these queries.
int query[2][2] = {{0, 2},{1, 3}};
int q = sizeof(query) / sizeof(query[0]);
// finding results of queries.
for(int i = 0;i

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论