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

DeepSeek LeetCode 3336. 最大公约数相等的子序列数量 Java实现

根据搜索结果,LeetCode 3336 有两种主流解法,这里提供对应的 Java 实现及说明。

方法一:多维 DP(记忆化搜索)

这种解法最直观,用“选或不选”的思维为每个元素做三种决策。

```java
class Solution {
private static final int MOD = 1_000_000_007;
private int[][][] memo;
private int[] nums;

public int subsequencePairCount(int[] nums) {
int n = nums.length;
this.nums = nums;
// 值域上限 200,多开一位存0(代表空序列的GCD)
memo = new int[n][201][201];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 201; j++) {
Arrays.fill(memo[i][j], -1);
}
}
// 从第一个元素开始,两个子序列初始GCD均为0
// 最后 -1 是为了排除两个子序列同时为空的情况
return (dfs(0, 0, 0) - 1 + MOD) % MOD;
}

private int dfs(int i, int g1, int g2) {
if (i == nums.length) {
// 两个子序列都必须非空且GCD相等
return (g1 != 0 && g2 != 0 && g1 == g2) ? 1 : 0;
}
if (memo[i][g1][g2] != -1) return memo[i][g1][g2];

int x = nums[i];
// 三种决策:不选 / 放入第一个 / 放入第二个
long skip = dfs(i + 1, g1, g2);
long put1 = dfs(i + 1, gcd(g1, x), g2);
long put2 = dfs(i + 1, g1, gcd(g2, x));

long ans = (skip + put1 + put2) % MOD;
memo[i][g1][g2] = (int) ans;
return memo[i][g1][g2];
}

private int gcd(int a, int b) {
while (b != 0) {
int tmp = a % b;
a = b;
b = tmp;
}
return a;
}
}
```

方法二:倍数容斥 AC

利用值域(≤200)和容斥原理优化计数,性能更优。

```java
class Solution {
private static final int MOD = 1_000_000_007;
private static final int MX = 201;
private static int[][] lcms = new int[MX][MX];
private static long[] pow2 = new long[MX];
private static long[] pow3 = new long[MX];
private static int[] mu = new int[MX];

static {
// 预处理:LCM、2/3的幂、莫比乌斯函数
for (int i = 1; i < MX; i++) {
for (int j = 1; j < MX; j++) {
lcms[i][j] = lcm(i, j);
}
}
pow2[0] = pow3[0] = 1;
for (int i = 1; i < MX; i++) {
pow2[i] = pow2[i-1] * 2 % MOD;
pow3[i] = pow3[i-1] * 3 % MOD;
}
mu[1] = 1;
for (int i = 1; i < MX; i++) {
for (int j = i*2; j < MX; j += i) {
mu[j] -= mu[i];
}
}
}

public int subsequencePairCount(int[] nums) {
int m = Arrays.stream(nums).max().orElse(0);
int[] cnt = new int[m+1];
for (int x : nums) cnt[x]++;

// cnt[i]:nums中i的倍数的个数
for (int i = 1; i <= m; i++) {
for (int j = i*2; j <= m; j += i) {
cnt[i] += cnt[j];
}
}

// f[g1][g2]:粗略计数
long[][] f = new long[m+1][m+1];
for (int g1 = 1; g1 <= m; g1++) {
for (int g2 = 1; g2 <= m; g2++) {
int l = lcms[g1][g2];
int c = (l <= m) ? cnt[l] : 0;
int c1 = cnt[g1], c2 = cnt[g2];
long val = pow3[c] * pow2[c1 + c2 - 2*c] % MOD;
val = (val - pow2[c1] - pow2[c2] + 1) % MOD;
f[g1][g2] = (val + MOD) % MOD;
}
}

// 倍数容斥求精确答案
long ans = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= m/i; j++) {
for (int k = 1; k <= m/i; k++) {
ans += (long) mu[j] * mu[k] * f[j*i][k*i];
ans %= MOD;
}
}
}
return (int) ((ans % MOD + MOD) % MOD);
}

private static int gcd(int a, int b) {
while (b != 0) { int t = a % b; a = b; b = t; }
return a;
}
private static int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
}
```

复杂度对比

· 多维 DP:O(n * 200 * 200) 时间与空间。
· 倍数容斥:O(m^3) 时间(m≤200),O(m^2) 空间。

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

相关文章:

  • FreqTrack:基于频域学习的RGB-Event多模态目标跟踪框架解析
  • 【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析附Matlab代码
  • Eclipse下Java SOAP服务开发实战:从WSDL到Tomcat部署
  • 408计算机组成原理思维导图|考研408计算机网络真题|考研408计算机网络应用题
  • 思维链与结构化 Prompt:大模型对话工程的深层优化实践
  • 卡梅德生物科普IL4(白细胞介素4):免疫平衡的关键调控靶
  • OpenClaw:本地AI工作流的可编程调度中枢
  • 2026李沧区专业的管道疏通公司推荐榜 - 品牌排行榜
  • 2026南昌漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 3分钟打造你的游戏隐身衣:用Deceive重新掌控社交边界
  • 从java走向java ee 从Java到Java EE?JVM不死,只是老当益壮
  • 2026年市面上质量好的电缆防火涂料源头厂家怎么选 - 品牌排行榜
  • 解放设计师双手:AI智能分层工具Layerdivider全攻略
  • PLM破解研发数据孤岛:跨部门流程协同与研发效率提升实战指南
  • ChatGPT帮我写SECS/GEM通信代码:一个MES工程师的AI提效实战
  • HarmonyOS技术精讲之Background Tasks Kit(后台任务开发服务)——基础概念与任务类型解析
  • YOLO自定义数据集GPU训练全链路实战指南
  • 怎样高效获取音乐歌词:3大实用技巧与专业工具实战指南
  • 2026南通防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • NSK精密滚珠丝杠W1404FA-2-C3T5技术指南
  • 华硕笔记本风扇噪音终极解决方案:G-Helper手动控制完全指南
  • 2026行业内数控线切割机床厂家推荐排行 - 品牌排行榜
  • Ice:重新定义macOS菜单栏的智能管家,让你的桌面回归极简
  • 学生寄电动车被骗?2026校园托运避坑指南 - 快递物流资讯
  • 2026青岛专业的管道疏通公司口碑推荐 - 品牌排行榜
  • 嵌入式GUI开发实战:emWin配置、驱动与优化全解析
  • 2026年近期广东AI玩具优质厂家专业解析:聚焦东莞市福盈电子科技有限公司 - 品牌鉴赏官2026
  • 分布式ID生成方案选型
  • 嵌入式GUI显示驱动配置实战:从emWin GUIDRV_SPage到硬件接口优化
  • BurpSuite专业版安装配置全攻略:从Java环境到HTTPS抓包