Skip to content

Commit

Permalink
添加注释
Browse files Browse the repository at this point in the history
  • Loading branch information
EndlessCheng committed Aug 21, 2024
1 parent 40ef01d commit d6c63b3
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 22 deletions.
45 changes: 25 additions & 20 deletions leetcode/biweekly/130/d/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ $$

可以在「计算幂次个数」的同时计算 $\texttt{sumE}$。

得到了幂次之和,**快速幂**计算 $2$ 的幂模 $\textit{mod}$,即为答案。关于快速幂,见 [50. Pow(x, n)](https://leetcode-cn.com/problems/powx-n/)
得到了幂次之和,可以用**快速幂**计算 $2$ 的幂模 $\textit{mod}$,即为答案。原理见[【图解】一张图秒懂快速幂](https://leetcode.cn/problems/powx-n/solution/tu-jie-yi-zhang-tu-miao-dong-kuai-su-mi-ykp3i/)

代码中用到的位运算技巧,见 [从集合论到位运算,常见位运算技巧分类总结!](https://leetcode.cn/circle/discuss/CaOJ45/)
代码中用到了一些位运算技巧,原理见 [从集合论到位运算,常见位运算技巧分类总结!](https://leetcode.cn/circle/discuss/CaOJ45/)

```py [sol-Python3]
class Solution:
Expand All @@ -84,12 +84,12 @@ class Solution:
if cnt1 <= k:
k -= cnt1
res += sum_i
n += 1 # 1
n |= 1 # 最低位填 1
# 剩余的 k 个幂次,由 n 的低 k 个 1 补充
for _ in range(k):
lb = n & -n
res += lb.bit_length() - 1
n ^= lb
n ^= lb # 去掉最低位的 1(置为 0)
return res
return [pow(2, sum_e(r + 1) - sum_e(l), mod) for l, r, mod in queries]
```
Expand All @@ -108,27 +108,30 @@ class Solution {
}

private long sumE(long k) {
long res = 0, n = 0, cnt1 = 0, sumI = 0;
long res = 0;
long n = 0;
long cnt1 = 0; // 之前填的 1 的个数
long sumI = 0; // 之前填的 1 的幂次之和
for (long i = 63 - Long.numberOfLeadingZeros(k + 1); i > 0; i--) {
long c = (cnt1 << i) + (i << (i - 1)); // 新增的幂次个数
if (c <= k) {
k -= c;
res += (sumI << i) + ((i * (i - 1) / 2) << (i - 1));
sumI += i; // 之前填的 1 的幂次之和
cnt1++; // 之前填的 1 的个数
sumI += i;
cnt1++;
n |= 1L << i; // 填 1
}
}
// 最低位单独计算
if (cnt1 <= k) {
k -= cnt1;
res += sumI;
n++; // 1
n |= 1; // 最低位填 1
}
// 剩余的 k 个幂次,由 n 的低 k 个 1 补充
while (k-- > 0) {
res += Long.numberOfTrailingZeros(n);
n &= n - 1;
n &= n - 1; // 去掉最低位的 1(置为 0)
}
return res;
}
Expand Down Expand Up @@ -160,27 +163,27 @@ class Solution {
}

long long sum_e(long long k) {
long long res = 0, n = 0, cnt1 = 0, sumI = 0;
for (long long i = 63 - __builtin_clzll(k + 1); i; i--) {
long long res = 0, n = 0, cnt1 = 0, sum_i = 0;
for (long long i = __lg(k + 1); i; i--) {
long long c = (cnt1 << i) + (i << (i - 1)); // 新增的幂次个数
if (c <= k) {
k -= c;
res += (sumI << i) + ((i * (i - 1) / 2) << (i - 1));
sumI += i; // 之前填的 1 的幂次之和
res += (sum_i << i) + ((i * (i - 1) / 2) << (i - 1));
sum_i += i; // 之前填的 1 的幂次之和
cnt1++; // 之前填的 1 的个数
n |= 1LL << i; // 填 1
}
}
// 最低位单独计算
if (cnt1 <= k) {
k -= cnt1;
res += sumI;
n++; // 1
res += sum_i;
n |= 1; // 最低位填 1
}
// 剩余的 k 个幂次,由 n 的低 k 个 1 补充
while (k--) {
res += __builtin_ctzll(n);
n &= n - 1;
n &= n - 1; // 去掉最低位的 1(置为 0)
}
return res;
}
Expand Down Expand Up @@ -215,12 +218,12 @@ func sumE(k int) (res int) {
if cnt1 <= k {
k -= cnt1
res += sumI
n++ // 1
n |= 1 // 最低位填 1
}
// 剩余的 k 个幂次,由 n 的低 k 个 1 补充
for ; k > 0; k-- {
res += bits.TrailingZeros(uint(n))
n &= n - 1
n &= n - 1 // 去掉最低位的 1(置为 0)
}
return
}
Expand Down Expand Up @@ -260,17 +263,19 @@ func pow(x, n, mod int) int {

## 分类题单

以下题单没有特定的顺序,可以按照个人喜好刷题。
[如何科学刷题?](https://leetcode.cn/circle/discuss/RvFUtj/)

1. [滑动窗口(定长/不定长/多指针)](https://leetcode.cn/circle/discuss/0viNMK/)
2. [二分算法(二分答案/最小化最大值/最大化最小值/第K小)](https://leetcode.cn/circle/discuss/SqopEo/)
3. [单调栈(基础/矩形面积/贡献法/最小字典序)](https://leetcode.cn/circle/discuss/9oZFK9/)
4. [网格图(DFS/BFS/综合应用)](https://leetcode.cn/circle/discuss/YiXPXW/)
5. [位运算(基础/性质/拆位/试填/恒等式/贪心/脑筋急转弯](https://leetcode.cn/circle/discuss/dHn9Vk/)
5. [位运算(基础/性质/拆位/试填/恒等式/思维](https://leetcode.cn/circle/discuss/dHn9Vk/)
6. [图论算法(DFS/BFS/拓扑排序/最短路/最小生成树/二分图/基环树/欧拉路径)](https://leetcode.cn/circle/discuss/01LUak/)
7. [动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)](https://leetcode.cn/circle/discuss/tXLS3i/)
8. [常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)](https://leetcode.cn/circle/discuss/mOr1u6/)
9. [数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)](https://leetcode.cn/circle/discuss/IYT3ss/)
10. [贪心算法(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)](https://leetcode.cn/circle/discuss/g6KTKL/)
11. [链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)](https://leetcode.cn/circle/discuss/K0n2gO/)

[我的题解精选(已分类)](https://github.com/EndlessCheng/codeforces-go/blob/master/leetcode/SOLUTIONS.md)

Expand Down
4 changes: 2 additions & 2 deletions leetcode/biweekly/130/d/d.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ func sumE(k int) (res int) {
if cnt1 <= k {
k -= cnt1
res += sumI
n++ // 1
n |= 1 // 最低位填 1
}
// 剩余的 k 个幂次,由 n 的低 k 个 1 补充
for ; k > 0; k-- {
res += bits.TrailingZeros(uint(n))
n &= n - 1
n &= n - 1 // 去掉最低位的 1(置为 0)
}
return
}
Expand Down

0 comments on commit d6c63b3

Please sign in to comment.