问题描述:
解题思路:
可以使用动态规划,建立dp[i][j][x],表示(1,1)到(i,j)且其积的余数为x的情况下的方案数。时间复杂度为(n^2) * k。
AC代码:
#include<bits/stdc++.h>
using namespace std;const int mod = 998244353;
int a[509][509];
int dp[509][509][30];void slove()
{int n, k;cin >> n >> k;for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)cin >> a[i][j];for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++){if(i == 1 && j == 1)dp[i][j][a[1][1] % k] = 1; // 初始化for(int z = 0; z < 20; z++) // 暴力枚举上一个dp的全部可能余数,因为%k,且k范围为1~20,所以可能的余数为余数1~19{// 向右dp[i][j+1][a[i][j+1] * z % k] += dp[i][j][z];dp[i][j+1][a[i][j+1] * z % k] %= mod;// 向下dp[i+1][j][a[i+1][j] * z % k] += dp[i][j][z];dp[i+1][j][a[i+1][j] * z % k] %= mod; }}cout << dp[n][n][0] << '\n';
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 取消同步流 slove();return 0;
}
知识点:动态规划