news 2026/6/11 8:53:01

Kimi LeetCode 3145. 大数组元素的乘积 TypeScript实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 3145. 大数组元素的乘积 TypeScript实现

我来为你提供 LeetCode 3145「大数组元素的乘积」的 TypeScript 实现。

TypeScript 实现

```typescript
function findProductsOfElements(queries: number[][]): number[] {
const MOD = 1e9 + 7;

// 快速幂:计算 a^b % mod
function qpow(a: bigint, b: bigint, mod: number): number {
let res: bigint = 1n % BigInt(mod);
a = a % BigInt(mod);
while (b > 0n) {
if ((b & 1n) === 1n) {
res = res * a % BigInt(mod);
}
a = a * a % BigInt(mod);
b >>= 1n;
}
return Number(res);
}

/**
* 计算 big_nums 前 k 个元素的幂次之和
* big_nums 中每个元素都是 2^i 的形式,乘积 = 2^(所有幂次之和)
*/
function calc(k: bigint): bigint {
let res: bigint = 0n; // 幂次之和
let n: bigint = 0n; // 当前确定的数字
let cnt1: bigint = 0n; // 已填的1的个数
let sum_i: bigint = 0n; // 已填的1的位下标之和

// 从高位到低位试填
// 最高可能的位数:找到最大的 i 使得 (cnt1 << i) + (i << (i-1)) 有意义
// 对于 k <= 1e15,最多约 50 位
let maxBit = 0;
let temp = k;
while (temp > 0n) {
maxBit++;
temp >>= 1n;
}
maxBit = Math.max(maxBit, 1);

for (let i = maxBit; i > 0; i--) {
const bi = BigInt(i);
const twoPowI = 1n << bi; // 2^i
const twoPowI_1 = 1n << (bi - 1n); // 2^(i-1)

// 如果在第 i 位填1,新增的幂次个数
const c = (cnt1 << bi) + (bi * twoPowI_1);

if (c <= k) {
k -= c;
// 新增幂次之和
res += (sum_i << bi) + ((bi * (bi - 1n) / 2n) * twoPowI_1);
sum_i += bi;
cnt1 += 1n;
n |= 1n << bi;
}
}

// 最低位(i = 0)单独处理
if (cnt1 <= k) {
k -= cnt1;
res += sum_i; // 最低位填1,已有1贡献0次幂(2^0=1,指数为0)
n |= 1n;
}

// 剩余 k 个幂次,由 n 的低 k 个1的位下标补充
while (k > 0n) {
// n & -n 得到最低位的1
const lowbit = n & (-n);
// 该1的位下标
const tz = BigInt(ctz(Number(lowbit)));
res += tz;
// 去掉最低位的1
n &= n - 1n;
k -= 1n;
}

return res;
}

// 计算二进制末尾0的个数(ctz: count trailing zeros)
function ctz(x: number): number {
if (x === 0) return 0;
let count = 0;
while ((x & 1) === 0) {
count++;
x >>= 1;
}
return count;
}

const ans: number[] = [];
for (const [from, to, mod] of queries) {
const power = calc(BigInt(to) + 1n) - calc(BigInt(from));
ans.push(qpow(2n, power, mod));
}

return ans;
}
```

更简洁的版本(参考灵茶山艾府的试填法)

```typescript
function findProductsOfElements(queries: number[][]): number[] {
// 快速幂
function qpow(a: bigint, b: bigint, mod: number): number {
let res = 1n % BigInt(mod);
a %= BigInt(mod);
while (b > 0n) {
if ((b & 1n) === 1n) res = res * a % BigInt(mod);
a = a * a % BigInt(mod);
b >>= 1n;
}
return Number(res);
}

// 计算 big_nums 前 k 个元素的幂次之和
function calc(k: bigint): bigint {
let res = 0n;
let n = 0n; // 当前构造的数字
let cnt1 = 0n; // n 中1的个数
let sum_i = 0n; // n 中1的位下标之和

// 从高位到低位试填
for (let i = 50; i > 0; i--) {
const bi = BigInt(i);
const add = (cnt1 << bi) + (bi << (bi - 1n)); // 填1新增的幂次个数

if (add <= k) {
k -= add;
res += (sum_i << bi) + ((bi * (bi - 1n) / 2n) << (bi - 1n));
sum_i += bi;
cnt1 += 1n;
n |= 1n << bi;
}
}

// 最低位
if (cnt1 <= k) {
k -= cnt1;
res += sum_i;
n |= 1n;
}

// 剩余 k 个
while (k > 0n) {
const lowbit = n & -n;
res += BigInt(Math.log2(Number(lowbit)));
n ^= lowbit;
k -= 1n;
}

return res;
}

return queries.map(([from, to, mod]) => {
const power = calc(BigInt(to) + 1n) - calc(BigInt(from));
return qpow(2n, power, mod);
});
}
```

核心思路

```
big_nums: 每个正整数的强数组(二进制中1对应的2^i)拼接而成

1 -> [1] -> 幂次: [0]
2 -> [2] -> 幂次: [1]
3 -> [1,2] -> 幂次: [0,1]
4 -> [4] -> 幂次: [2]
5 -> [1,4] -> 幂次: [0,2]
...

big_nums 中每个元素都是 2^i,所以乘积 = 2^(幂次之和)

calc(k): 求前 k 个元素的幂次之和(试填法从高位到低位构造数字)
```

复杂度

指标 复杂度
时间 O(q \cdot \log U),约 O(q \cdot 50)
空间 O(1)

TypeScript 中使用 `BigInt` 处理大数,因为 k 最大可达 10^{15},需要 64 位整数精度。

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

cxx2flow WebAssembly实现:如何在浏览器中运行C++代码分析

cxx2flow WebAssembly实现&#xff1a;如何在浏览器中运行C代码分析 【免费下载链接】cxx2flow 将 C/C 代码转换成流程图 / Turn your C/C code into flowchart 项目地址: https://gitcode.com/gh_mirrors/cx/cxx2flow cxx2flow是一款强大的工具&#xff0c;能将C/C代码…

作者头像 李华
网站建设 2026/6/11 8:35:51

防火推拉窗材质选型、密封防火系统及消防验收关键技术研究

防火推拉窗是建筑防火分隔、阻烟隔热、遏制火势竖向与水平蔓延的核心消防构件&#xff0c;广泛应用于工业厂房、商业综合体、高层建筑、地下附属空间等场景。区别于固定防火窗&#xff0c;其可开启推拉结构存在型材拼接缝隙、轨道滑动间隙、五金活动节点等天然防火薄弱点&#…

作者头像 李华
网站建设 2026/6/11 8:33:14

别再只调PID了!基于STM32的四旋翼飞控,这些底层驱动与框架设计才是关键

STM32四旋翼飞控开发&#xff1a;从寄存器操作到实时框架设计的深度实践四旋翼无人机飞控开发领域存在一个有趣的现象&#xff1a;大多数开发者能熟练调参PID算法&#xff0c;却对底层传感器数据如何准确获取、电机控制信号如何稳定输出等基础问题束手无策。这种现象就像厨师精…

作者头像 李华
网站建设 2026/6/11 8:32:41

黑洞与暗物质晕相互作用的物理模型与观测特征

1. 黑洞与暗物质晕相互作用的物理背景现代天体物理学中最引人入胜的谜题之一&#xff0c;莫过于黑洞与暗物质晕的复杂相互作用。想象一下&#xff0c;一个质量可达太阳数十亿倍的超级黑洞&#xff0c;被一团看不见的物质云团所包围——这就是许多星系中心的真实写照。暗物质虽然…

作者头像 李华
网站建设 2026/6/11 8:32:11

多模态嵌入模型优化:视觉令牌压缩与渐进式训练

1. 多模态嵌入模型的核心挑战与优化方向当前多模态嵌入模型面临的核心瓶颈在于视觉令牌处理的高计算成本。以典型的2B参数规模模型为例&#xff0c;处理一张224224分辨率图像需要约2000个视觉令牌&#xff0c;而实际有效语义信息可能仅集中在25%的令牌中。这种冗余导致两个主要…

作者头像 李华