# 2470. Number of Subarrays With LCM Equal to K
###### tags: `Leetcode` `Medium` `Math`
Link:
## 思路
和[2447. Number of Subarrays With GCD Equal to K](https://hackmd.io/0-gZfdDARlCFnon9Pibang)很像
java里面没有计算lcm的函数,但我们可以用```LCM(a,b) = (axb) / GCD(a,b)```(参考[这里](https://www.geeksforgeeks.org/program-to-find-lcm-of-two-numbers/))
但c++和python里面可以直接用lcm函数
### 思路一 $O(N^2)$
遍历所有subarray
### 思路二 $O(NK)$
## Code
### O(N^2)
```java=
class Solution {
public int subarrayLCM(int[] nums, int k) {
int ans = 0;
int n = nums.length;
for(int i=0; i<n; i++){
int lcm = nums[i];
for(int j=i; j<n; j++){
if(lcm%nums[j]!=0){
lcm = getLCM(lcm, nums[j]);
}
if(lcm==k) ans++;
if(lcm>k) break;
}
}
return ans;
}
public int getLCM(int a, int b)
{
return (a/gcd(a, b))*b;
}
public int gcd(int a, int b){
if (a==0) return b;
return gcd(b%a, a);
}
}
```
### O(NK)
```java=
class Solution {
public int subarrayLCM(int[] nums, int k) {
int ans = 0;
int n = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for(int i=0; i<n; i++){
map.put(nums[i], map.getOrDefault(nums[i], 0)+1);
Map<Integer, Integer> map1 = new HashMap<>();
for(int key:map.keySet()){
int lcm = getLCM(key, nums[i]);
if(k%lcm==0) map1.put(lcm, map1.getOrDefault(lcm, 0)+map.get(key));
}
map = map1;
ans += map.getOrDefault(k,0);
}
return ans;
}
public int getLCM(int a, int b)
{
return (a/gcd(a, b))*b;
}
public int gcd(int a, int b){
if (a==0) return b;
return gcd(b%a, a);
}
}
```