DeepSeek LeetCode 3855. 给定范围内 K 位数字之和 JavaScript实现

发布时间:2026/8/10 9:41:52
DeepSeek    LeetCode 3855. 给定范围内 K 位数字之和 JavaScript实现 解题思路核心公式与之前一致· 共有 n r - l 1 个可选数字。· 每个数位独立地从 [l, r] 中选择。· 所有 k 位数共有 n^k 个。· 固定某一位其余 k-1 位任意组合共 n^(k-1) 种。· 该位上所有数字之和 (l r) * n / 2。· 所有数位的权值之和 1 10 ... 10^(k-1) (10^k - 1) / 9。因此答案 ((lr)*n/2) × n^(k-1) × (10^k - 1) / 9均在模 1e97 下计算。---JavaScript 实现使用 BigInt 避免溢出javascriptconst MOD 1000000007n;/*** param {number} l* param {number} r* param {number} k* return {number}*/var sumOfNumbers function(l, r, k) {const L BigInt(l);const R BigInt(r);const K BigInt(k);const n R - L 1n; // 可选数字个数const digitSum (L R) * n / 2n; // 单个数位的数字总和// 快速幂 (a^b % MOD)function modPow(a, b) {a a % MOD;let result 1n;while (b 0n) {if (b 1n) result (result * a) % MOD;a (a * a) % MOD;b 1n;}return result;}// term1 digitSum * n^(k-1) % MODconst term1 (digitSum % MOD) * modPow(n, K - 1n) % MOD;// term2 (10^k - 1) / 9 % MODconst pow10 modPow(10n, K);const inv9 modPow(9n, MOD - 2n); // 费马小定理求逆元const term2 ((pow10 - 1n MOD) % MOD) * inv9 % MOD;const ans term1 * term2 % MOD;return Number(ans); // 转为 Number 返回};---不使用 BigInt 的纯 Number 版本需注意中间值不超过 2^53如果题目保证 l, r, k 不大也可以使用 Number但需在每一步取模避免溢出1e97 的平方约 1e18在安全整数范围内javascriptconst MOD 1000000007;function modPow(a, b) {a % MOD;let res 1;while (b 0) {if (b 1) res (res * a) % MOD;a (a * a) % MOD;b 1;}return res;}var sumOfNumbers function(l, r, k) {const n r - l 1;const digitSum (l r) * n / 2; // 注意除法是精确的因为 (lr)*n 必为偶数const term1 (digitSum % MOD) * modPow(n, k - 1) % MOD;const pow10 modPow(10, k);const inv9 modPow(9, MOD - 2);const term2 ((pow10 - 1 MOD) % MOD) * inv9 % MOD;return (term1 * term2) % MOD;};---复杂度分析· 时间复杂度O(log k)主要是快速幂运算。· 空间复杂度O(1)。