当前位置: 首页 > news >正文

Kimi LeetCode 3426. 所有安放棋子方案的曼哈顿距离 Java实现

以下是 LeetCode 3426. 所有安放棋子方案的曼哈顿距离 的 Java 实现。

---

解题思路

这道题的核心是 组合数学 + 贡献法,时间复杂度 O(log MOD),空间复杂度 O(1)。

关键观察

1. 贡献法:任选两个格子 A 和 B,设它们之间的曼哈顿距离为 d。在所有 `C(m*n, k)` 种方案中,包含这两个格子的方案数为 `C(m*n-2, k-2)`。因此,这对格子对答案的总贡献 = `d * C(m*n-2, k-2)`。

2. 由于所有点对的"重数"相同,我们可以先计算 k=2 时的总距离,再乘以 `C(m*n-2, k-2)` 即可。

3. 计算 k=2 时的总距离:将曼哈顿距离拆分为行差和列差:
- 行差:对于距离 d(1 ≤ d ≤ m-1),有 `(m-d)` 对行可以选择。对于每对行,两个棋子各有 n 种列的选择,所以贡献为 `d * (m-d) * n²`。总和 = `n² * Σ(d*(m-d)) = n² * (m³ - m) / 6`
- 列差(对称):总和 = `m² * (n³ - n) / 6`

4. 组合数计算:使用费马小定理计算逆元,时间复杂度 O(k) 或 O(log MOD)。

---

Java 完整代码

```java
class Solution {
private static final int MOD = 1_000_000_007;

public int distanceSum(int m, int n, int k) {
// 计算行方向的贡献: n^2 * (m^3 - m) / 6
long rowContrib = (long) n * n % MOD;
long mCubeMinusM = ((long) m * m % MOD * m % MOD - m + MOD) % MOD;
rowContrib = rowContrib * mCubeMinusM % MOD * modInverse(6, MOD) % MOD;

// 计算列方向的贡献: m^2 * (n^3 - n) / 6
long colContrib = (long) m * m % MOD;
long nCubeMinusN = ((long) n * n % MOD * n % MOD - n + MOD) % MOD;
colContrib = colContrib * nCubeMinusN % MOD * modInverse(6, MOD) % MOD;

// k=2 时的总距离
long totalDistK2 = (rowContrib + colContrib) % MOD;

// 乘以 C(m*n-2, k-2)
long comb = nCk(m * n - 2, k - 2);

return (int) (totalDistK2 * comb % MOD);
}

// 计算组合数 C(n, k) mod MOD
private long nCk(int n, int k) {
long res = 1;
for (int i = 1; i <= k; i++) {
res = res * (n - i + 1) % MOD;
res = res * modInverse(i, MOD) % MOD;
}
return res;
}

// 快速幂计算 x^(-1) mod MOD(费马小定理)
private long modInverse(long x, int mod) {
return modPow(x, mod - 2, mod);
}

// 快速幂计算 x^n mod mod
private long modPow(long x, long n, int mod) {
long res = 1;
x = x % mod;
while (n > 0) {
if ((n & 1) == 1) {
res = res * x % mod;
}
x = x * x % mod;
n >>= 1;
}
return res;
}
}
```

---

测试验证

输入 输出 说明
`m=2, n=2, k=2` `8` 6 种方案,4 种距离为 1,2 种距离为 2,总和 = 4×1 + 2×2 = 8
`m=1, n=4, k=3` `20` 4 种方案,首尾距离为 4,中间距离为 6,总和 = 4 + 6 + 6 + 4 = 20
`m=1, n=4, k=4` `10` 1 种方案,距离 = 1+1+2 = 3?不对,应为 1+2+3 = 6?需要验证
`m=5, n=1, k=5` `20` 1 种方案,距离 = 1+2+3+4 = 10?需要验证

> 注:后两个示例的具体数值以 LeetCode 官方验证为准,核心算法逻辑(组合数学 + 贡献法)是正确的。

下载完整代码:[leetcode_3426.java](sandbox:///mnt/agents/output/leetcode_3426.java)

http://www.jsqmd.com/news/1088770/

相关文章:

  • 空洞骑士模组管理器Scarab:2024终极安装与管理完全指南
  • 2026免费去水印软件哪个好用?电脑手机无广告工具全推荐
  • Selenium与Xlrd实现设备不下电自动化测试与监控
  • VoiceFixer语音修复工具终极指南:如何一站式解决音频噪声、失真和低质量语音问题?
  • Video2X终极指南:三步实现AI视频放大和帧率提升的免费方案
  • Ubuntu 系统报错:System has not been booted with systemd as init system 的深度诊断与修复指南
  • ncmdump:终极音乐格式转换工具,3分钟实现NCM解密与音乐播放自由
  • 所有权与生命周期:Rust 内存安全的两道防线,从编译器报错到实战通关
  • 从零到一:Composer环境搭建与高效配置全攻略
  • BetterGI 0.38.1版本安装失败怎么办?三步教你快速解决自动拾取和全自动钓鱼问题
  • SpringBoot+Vue 在线政务服务中心_nrlwabo平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • RA8D2 SCI模块LIN总线冲突检测与比特率测量实战解析
  • 华为防火墙双机热备实战:从VRRP到VGMP的平滑演进
  • MoE架构揭秘:1.8万亿参数与2%稀疏激活的工程真相
  • 雷电模拟器4.0.83抓包全攻略:Burp Suite 2023代理配置与HTTPS解密
  • DLSS Swapper完整指南:一键智能切换DLSS版本,轻松提升游戏性能
  • WEB UI自动化测试八大元素定位方式详解:从原理到实战
  • 影刀RPA新手教程:多账号并发自动化完全指南——线程管理、资源隔离与异常恢复
  • 3步极简操作!res-downloader全平台资源下载解密神器完全指南
  • 如何快速掌握BetterJoy:Switch控制器在PC上的终极解决方案
  • 从零到一:CloudCompare点云语义标注实战指南
  • Mythos:首个可规模化漏洞挖掘的AI安全模型解析
  • 逆向工程实战:从CrackMe019入门软件保护与算法分析
  • 3分钟搞定B站视频转文字:Bili2Text终极免费工具完全指南
  • Diffie-Hellman密钥交换:从离散对数原理到Java工程实现
  • 四十六、QT应用开发之MVC架构实战:从解耦到多线程的完整实现
  • Buzz多语言转录实战测评:三大场景深度揭秘准确率真相
  • 使用演进路线目前使用过的工具列举:
  • Python异常测试实战:pytest.raises从入门到精通
  • UE4SS终极指南:如何掌握虚幻引擎游戏修改与逆向工程