给你一个长度为 n 的整数数组 nums 和一个大小为 q 的二维整数数组 queries,其中 queries[i] = [li, ri, ki, vi]。
对于每个查询,按以下步骤执行操作:
- 设定
idx = li。 - 当
idx <= ri时:- 更新:
nums[idx] = (nums[idx] * vi) % (109 + 7) - 将
idx += ki。
- 更新:
在处理完所有查询后,返回数组 nums 中所有元素的 按位异或结果。
示例 1:
输入: nums = [1,1,1], queries = [[0,2,1,4]]
输出: 4
解释:
- 唯一的查询
[0, 2, 1, 4]将下标 0 到下标 2 的每个元素乘以 4。 - 数组从
[1, 1, 1]变为[4, 4, 4]。 - 所有元素的异或为
4 ^ 4 ^ 4 = 4。
示例 2:
输入: nums = [2,3,1,5,4], queries = [[1,4,2,3],[0,2,1,2]]
输出: 31
解释:
- 第一个查询
[1, 4, 2, 3]将下标 1 和 3 的元素乘以 3,数组变为[2, 9, 1, 15, 4]。 - 第二个查询
[0, 2, 1, 2]将下标 0、1 和 2 的元素乘以 2,数组变为[4, 18, 2, 15, 4]。 - 所有元素的异或为
4 ^ 18 ^ 2 ^ 15 ^ 4 = 31。
提示:
1 <= n == nums.length <= 10^31 <= nums[i] <= 10^91 <= q == queries.length <= 10^3queries[i] = [li, ri, ki, vi]0 <= li <= ri < n1 <= ki <= n1 <= vi <= 10^5
分析:由于数据量比较小,直接暴力模拟,先计算所有查询,然后再对所有元素进行异或。
cpp
class Solution {
public:
int xorAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
int n=queries.size();
long long mod=1e9+7;
for(int i=0;i<n;++i)
{
int l=queries[i][0],r=queries[i][1],k=queries[i][2],v=queries[i][3];
for(int idx=l;idx<=r;idx+=k)
nums[idx]=(long long)(1LL*nums[idx]*v)%mod;
}
int ans=nums[0];
for(int i=1;i<nums.size();++i)
ans=ans^nums[i];
return ans;
}
};