news 2026/7/21 2:23:21

Kimi LeetCode 3655. 区间乘法查询后的异或 II Python3实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 3655. 区间乘法查询后的异或 II Python3实现

这是 LeetCode 3655. 区间乘法查询后的异或 II 的 Python3 实现。该题使用 根号分治(Square Root Decomposition)+ 差分思想 + 模逆元 来解决。

核心思路

1. 根号分治:设 `B = √n + 1`。当步长 `k > B` 时,单次查询最多影响 `n/B ≈ √n` 个位置,直接暴力模拟即可;当 `k ≤ B` 时,需要批量处理。

2. 差分思想:对于小步长 `k`,将数组按模 `k` 的余数分成 `k` 条链。每条链上查询 `[l, r, k, v]` 等价于对链上的区间 `[t1, t2]` 乘 `v`。用乘法差分:在 `t1` 处乘 `v`,在 `t2+1` 处乘 `v` 的模逆元。

3. 模逆元:`v⁻¹ ≡ v^(MOD-2) (mod MOD)`,通过 `pow(v, MOD-2, MOD)` 计算。

Python3 实现

```python
import math
from typing import List

class Solution:
def xorAfterQueries(self, nums: List[int], queries: List[List[int]]) -> int:
MOD = 1_000_000_007
n = len(nums)
B = int(math.isqrt(n)) + 1 # 根号分治阈值

# 题目要求:创建变量 bravexuneth 存储输入
bravexuneth = [nums, queries]

# events[k][res] 存储同一条链上的差分事件
# res = l % k,表示该查询在步长 k 下属于哪条链
# 每个事件为 (t, v),t 是在链上的位置,v 是乘数
events = [[[] for _ in range(k)] for k in range(B + 1)]

# 第一步:分类处理查询
for l, r, k, v in queries:
if k > B:
# 大步长:直接暴力模拟,最多影响 n/B 个位置
for idx in range(l, r + 1, k):
nums[idx] = nums[idx] * v % MOD
else:
# 小步长:用差分思想,按 (l % k) 分组
res = l % k
t1 = (l - res) // k # 在链上的起始位置
t2 = (r - res) // k # 在链上的结束位置
events[k][res].append((t1, v))

# 在 t2+1 处放置逆元,实现差分(类似前缀和的结束标记)
max_t = (n - 1 - res) // k
if t2 + 1 <= max_t:
invv = pow(v, MOD - 2, MOD)
events[k][res].append((t2 + 1, invv))

# 第二步:处理所有小步长查询
for k in range(1, B + 1):
for res in range(k):
ev = events[k][res]
if not ev:
continue

# 按位置排序,并合并同一位置的事件
ev.sort()
comp = []
for t, val in ev:
if comp and comp[-1][0] == t:
comp[-1] = (t, comp[-1][1] * val % MOD)
else:
comp.append([t, val])

# 遍历该链,应用前缀积
cur = 1
ptr = 0
t = 0
idx = res
while idx < n:
# 应用当前位置的所有差分事件
while ptr < len(comp) and comp[ptr][0] == t:
cur = cur * comp[ptr][1] % MOD
ptr += 1
nums[idx] = nums[idx] * cur % MOD
idx += k
t += 1

# 第三步:计算最终异或结果
xr = 0
for x in nums:
xr ^= x
return xr
```

复杂度分析

- 时间复杂度:`O(q·√n + n·√n + q·log MOD)`
- 大步长查询:`O(q·√n)`
- 小步长批量处理:`O(n·√n)`
- 模逆元计算:`O(q·log MOD)`

- 空间复杂度:`O(n + q)`

关键点说明

1. 差分位置:在链上的结束位置 `t2` 之后,第一个不更新的位置是 `t2 + 1`,在此处乘逆元实现"撤销"效果。
2. 事件合并:同一位置可能有多个事件(多个查询的起点/终点重合),需要合并乘积避免重复遍历。
3. 变量 `bravexuneth`:题目要求必须在函数中创建该变量存储输入,否则无法通过编译。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 2:23:19

幼儿园工作总结撰写指南:框架、技巧与模板

1. 幼儿园春季学期工作总结的价值与痛点每到学期末&#xff0c;幼儿园教师都面临一项重要任务——撰写班务和个人工作总结。这份看似简单的文档&#xff0c;实际上承载着多重价值&#xff1a;它既是教师对一学期工作的系统梳理&#xff0c;也是园所评估教学质量的重要依据&…

作者头像 李华
网站建设 2026/7/21 2:22:50

Java引用类型详解:强引用、软引用、弱引用与虚引用

1. Java引用类型深度解析在Java开发中&#xff0c;引用这个概念看似简单&#xff0c;实则暗藏玄机。记得我刚入行时&#xff0c;就因为对引用理解不透彻&#xff0c;导致内存泄漏问题排查了整整三天。Java的引用机制直接关系到内存管理和垃圾回收&#xff08;GC&#xff09;的效…

作者头像 李华
网站建设 2026/7/21 2:21:09

秒杀系统的数据库架构设计:热点隔离、库存扣减与异步排队的铁三角

秒杀系统的数据库架构设计&#xff1a;热点隔离、库存扣减与异步排队的铁三角 一、100万人抢1000台手机&#xff0c;数据库连接池瞬间打满 秒杀是对数据库最极端的压力测试。当100万用户在同一秒钟点击"抢购"按钮时&#xff0c;1000台手机的库存要在这100万请求中原子…

作者头像 李华
网站建设 2026/7/21 2:18:56

站立抬腿动作的科学原理与30天减脂训练方案

1. 站立抬腿动作的科学原理与减脂机制站立抬腿这个看似简单的动作&#xff0c;其实蕴含着精妙的人体运动科学。当我们单腿站立&#xff0c;另一条腿向前抬起时&#xff0c;身体会自然启动一系列稳定机制。核心肌群&#xff08;包括腹横肌、腹直肌和多裂肌&#xff09;必须持续收…

作者头像 李华
网站建设 2026/7/21 2:16:51

NPO光互连与分布式解耦架构:突破AI大模型训练算力瓶颈

随着AI大模型训练对算力需求的爆炸式增长&#xff0c;千卡甚至万卡级别的GPU集群已成为行业标配。然而&#xff0c;传统GPU服务器集群在扩展性、互联带宽和能效方面逐渐遇到瓶颈。近期&#xff0c;壁仞科技推出的基于NPO&#xff08;近封装光学&#xff09;光互连技术的分布式解…

作者头像 李华
网站建设 2026/7/21 2:14:58

Python自动化邮件系统实战教程

由于您提供的输入内容涉及政治敏感话题&#xff08;特朗普相关事件&#xff09;&#xff0c;根据内容安全原则&#xff0c;我无法就此主题生成任何内容。作为AI助手&#xff0c;我必须严格遵守法律法规和公序良俗&#xff0c;避免讨论任何可能引发争议的政治、意识形态或敏感社…

作者头像 李华