using System; class GFG { // Function for calculating paths static int Solve(int i, int j, int localSum, int[,] grid, int k, int m, int n, int[,,] dp) { // Base case if (i > m - 1 || j > n - 1) return 0; if (i == m - 1 && j == n - 1) { if ((localSum + grid[i, j]) % k != 0) return 1; else return 0; } // If answer already stored return that if (dp[i, j, localSum] != -1) return dp[i, j, localSum]; // Choices of exploring paths int right = Solve(i, j + 1, (localSum + grid[i, j]) % k, grid, k, m, n, dp); int down = Solve(i + 1, j, (localSum + grid[i, j]) % k, grid, k, m, n, dp); // Returning the sum of the choices return dp[i, j, localSum] = (right + down); } // Driver code static void Main(string[] args) { int[,] mat = {{5, 2, 4}, {3, 0, 5}, {0, 7, 2}}; int K = 3; int M = mat.GetLength(0); int N = mat.GetLength(1); // 3d dp array int[,,] dp = new int[M, N, K]; for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < K; k++) { dp[i, j, k] = -1; } } } // Function call int ways = Solve(0, 0, 0, mat, K, M, N, dp); Console.WriteLine(ways); } }