# Solving Leetcode Interviews in Seconds with AI: Paths in Matrix Whose Sum Is Divisible by K


	# Introduction
	In this blog post, we will explore how to solve the LeetCode problem "2435" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like [Chatmagic](https://www.chatmagic.app), we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

	# Problem Statement
	> You are given a 0-indexed m x n integer matrix grid and an integer k. You are currently at position (0, 0) and you want to reach position (m - 1, n - 1) moving only down or right. Return the number of paths where the sum of the elements on the path is divisible by k. Since the answer may be very large, return it modulo 109 + 7.   Example 1:   Input: grid = [[5,2,4],[3,0,5],[0,7,2]], k = 3 Output: 2 Explanation: There are two paths where the sum of the elements on the path is divisible by k. The first path highlighted in red has a sum of 5 + 2 + 4 + 5 + 2 = 18 which is divisible by 3. The second path highlighted in blue has a sum of 5 + 3 + 0 + 5 + 2 = 15 which is divisible by 3.  Example 2:   Input: grid = [[0,0]], k = 5 Output: 1 Explanation: The path highlighted in red has a sum of 0 + 0 = 0 which is divisible by 5.  Example 3:   Input: grid = [[7,3,4,9],[2,3,6,2],[2,3,7,0]], k = 1 Output: 10 Explanation: Every integer is divisible by 1 so the sum of the elements on every possible path is divisible by k.    Constraints:  m == grid.length n == grid[i].length 1 <= m, n <= 5 * 104 1 <= m * n <= 5 * 104 0 <= grid[i][j] <= 100 1 <= k <= 50  

	# Explanation
	Here's the approach, complexity analysis, and Python code for solving the problem:

*   **Dynamic Programming:** Use dynamic programming to store the number of paths to reach a cell with a specific sum modulo `k`.
*   **Modulo Optimization:** Store only the modulo of the sum with `k` to reduce memory usage. The state `dp[i][j][rem]` represents the number of paths to cell `(i, j)` with sum having remainder `rem` when divided by `k`.
*   **Base Case & Transitions:** Initialize the starting cell.  For each cell, the number of paths is the sum of paths from the top and left cells, updated for the current cell's value modulo `k`.

*   **Time Complexity:** O(m * n * k)
*   **Space Complexity:** O(m * n * k)

	
	# Code
	```python
	def k_divisible_paths(grid, k):
    m, n = len(grid), len(grid[0])
    dp = [[[0] * k for _ in range(n)] for _ in range(m)]
    dp[0][0][grid[0][0] % k] = 1
    mod = 10**9 + 7

    for i in range(m):
        for j in range(n):
            for rem in range(k):
                if dp[i][j][rem] > 0:
                    new_rem = (rem + grid[i][j]) % k
                    if i + 1 < m:
                        dp[i + 1][j][(rem + grid[i+1][j]) % k] = (dp[i + 1][j][(rem + grid[i+1][j]) % k] + dp[i][j][rem]) % mod
                    if j + 1 < n:
                        dp[i][j + 1][(rem + grid[i][j+1]) % k] = (dp[i][j + 1][(rem + grid[i][j+1]) % k] + dp[i][j][rem]) % mod

    return dp[m - 1][n - 1][0]
	```
			
