dictionary changed size during iteration
# to avoid this problem, make a copy of keys: for i in list(d) # Can also solve this problem here: # https://leetcode.com/problems/binary-trees-with-factors/ arr = [2,4,5,10] dp = collections.defaultdict(int) # this would create error since dp[x/i] is creating a new key with x/i # thus dictionary changed size during iteration # to solve this problem, dp.copy() can be used but with time complexity O(n^2) for x in sorted(arr): dp[x] = sum(dp[i]*dp[x/i] for i in dp if x % i == 0) + 1 return sum(dp.values()) % (10**9 + 7) # use `get` since it just query the dictionay without creating a new key # time complexity: O(n) for x in sorted(arr): dp[x] = sum(dp[i] * dp.get(x / i, 0) for i in dp if x % i == 0) + 1 return sum(dp.values()) % (10**9 + 7)