解法:DP
维护 f[i][j][t] 表示以 (i, j) 为终点,且路径和 mod k 等于 t 的路径数。答案就是 f[n - 1][m - 1][0]。
转移方程为:
f[i][j][t] =
f[i - 1][j][(t - grid[i][j]) mod k] + // 从上方走过来
f[i][j - 1][(t - grid[i][j]) mod k] // 从左方走过来
复杂度 $\mathcal{O}(nmk)$。
参考代码(c++)
###c++
class Solution {
int n, m;
const int MOD = 1000000007;
public:
int numberOfPaths(vector<vector<int>>& grid, int K) {
n = grid.size(); m = grid[0].size();
long long f[n][m][K];
memset(f, 0, sizeof(f));
// 初值
f[0][0][grid[0][0] % K] = 1;
for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) for (int k = 0; k < K; k++) {
// 从上方走过来
if (i > 0) f[i][j][k] = (f[i][j][k] + f[i - 1][j][(k - grid[i][j] % K + K) % K]) % MOD;
// 从左方走过来
if (j > 0) f[i][j][k] = (f[i][j][k] + f[i][j - 1][(k - grid[i][j] % K + K) % K]) % MOD;
}
return f[n - 1][m - 1][0];
}
};