🗒️3411. 最长乘积等价子数组
2025-4-12
| 2025-4-12
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
创建时间
Apr 12, 2025 09:47 AM
给你一个由 正整数 组成的数组 nums
如果一个数组 arr 满足 prod(arr) == lcm(arr) * gcd(arr),则称其为 乘积等价数组 ,其中:
  • prod(arr) 表示 arr 中所有元素的乘积。
  • gcd(arr) 表示 arr 中所有元素的最大公因数 ()。
    • GCD
  • lcm(arr) 表示 arr 中所有元素的最小公倍数 ()。
    • LCM
返回数组 nums 的 最长 乘积等价 子数组 的长度。

不定长滑动窗口

这道题一点思路没有。看了题解,原来是数论的题!!!5555
任何正整数都可以表示为质因数的乘积:
设 a = p1^x1 * p2^x2 * ... * pn^xn, b = p1^y1 * p2^y2 * ... * pn^yn,其中 pi 是质数,xi 和 yi 是对应的指数(可以为 0)
那么有 a * b = p1^(x1+y1) * p2^(x2+y2) * ... * pn^(xn+yn)
对于最大公约数 gcd(a,b) 取每个质因数的最小指数: gcd(a,b) = p1^min(x1,y1) * p2^min(x2,y2) * ... * pn^min(xn,yn)
对于最小公倍数 lcm(a,b),取每个质因数的最大指数:lcm(a,b) = p1^max(x1,y1) * p2^max(x2,y2) * ... * pn^max(xn,yn)
因此,
gcd(a,b) * lcm(a,b)=p1^(min(x1,y1)+max(x1,y1)) * p2^(min(x2,y2)+max(x2,y2)) * ... * pn^(min(xn,yn)+max(xn,yn))
对于任意两个数,其中一个质数的指数有 min(x,y) + max(x,y) = x + y,则必有 gcd(a,b) * lcm(a,b) = a * b
这里有推论,具体证明看 灵茶山艾府 的题解
时, 当且仅当 时成立。
也就是对于一组数来说,质因数的每个指数只能由其中一个数贡献。这意味着,如果 ,那么这  个数(a*b*c*.. 的这些数,不是因数)必须两两互质。两两互质,就是最大公约数为 1.
只能说秒啊!!!!

📎 参考

  • 【题单】滑动窗口与双指针
  • 3413. 收集连续 K 个袋子可以获得的最多硬币数量2781. 最长合法子字符串的长度
    Loading...