# [2183. Count Array Pairs Divisible by K](https://leetcode.com/problems/count-array-pairs-divisible-by-k/) ##### tags: `leetcode` [TOC] ## Description ![](https://i.imgur.com/CIT5cLA.png) ## Ideas ### way1 * 首先暴力解的話,就是創建兩個for loop 每次都判斷是否整除 * TC(n^2 * log(max_val) ) * TLE ### way2 * 因為此題其實就是在找 k 的因數,所以創建一個memo儲存看過的num所擁有的因數 * 每次計算新的num時,先計算缺少了哪些因素,再去查找memo * 接著更新memo * TC(n*k) TLE ```python= class Solution: def coutPairs(self, nums: List[int], k: int) -> int: memo = [0] * (k + 1) res = 0 for n in nums: gcd = math.gcd(k, n) # TC = O(log(k+n)) needed = k // gcd for cd in range(needed, k+1, needed): # TC = O(needed) = O(k) res += memo[cd] memo[gcd] += 1 return res ``` ### way3 * 沒想到還是TLE了...第二層迴圈還是花太多時間 * 這次創建一個array factor直接先儲存1~k的所有因素 * 第二層迴圈小修改 * TC = O((n+k) * k^0.5) python ```python= class Solution: def coutPairs(self, nums: List[int], k: int) -> int: factor = [[] for i in range(k+1)] for i in range(1, k+1): # TC = O(k) for j in range(i, k+1, i): # TC = O(k^0.5) factor[j].append(i) memo = [0] * (k+1) res = 0 for n in nums: # TC = O(n) gcd = math.gcd(n, k) res += memo[k // gcd] for i in factor[gcd]: # TC = O(k^0.5) memo[i] += 1 return res ``` c++ ```cpp= class Solution { public: long long coutPairs(vector<int>& nums, int k) { vector<int> factor; for(int d = 1; d <= k; ++d) { if (k % d == 0) factor.push_back(d); } long long res = 0; vector<int> memo(k+1, 0); for (auto n: nums) { // TC = O(n) int g = gcd(n, k); res += memo[k / g]; for (auto f: factor) { // TC = O(k^0.5) if (g % f == 0) ++memo[f]; } } return res; } }; ```