问题描述:
解题思路:
可以使用动态规划,建立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;
}
知识点:动态规划