题目
给定矩阵,矩阵每个元素有一个
的值,可以从任意点出发并在任意点停止,但只能向下或向右走。走必须为偶数步,每一步会得到一个权值
,求方案数,满足
,
为每一步的权值。
数据范围:
dp策略
先令为终点在
的符合条件的方案数(
中为其他刻画状态条件),可以看出,其主要依赖于
两项(考虑奇偶步),或依赖于
三项(不考虑奇偶步).
由于求和涉及,故先考虑
,表示终点在
,
的方案数(不考虑奇偶步),
.
依赖于
三项,但这样做时间空间都会炸掉
ε=ε=ε=ε=ε=ε=┌(; ̄◇ ̄)┘
考虑,进行变形
,
,
刻画差值,
刻画步数(奇数为0,偶数为1),.
.
依赖于
两项,空间与时间都是
初始化: ,其余为0
转移方程:
ps: 数组开
,不然莫名MLE
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
using LL = long long;
const int MOD = 1e9 + 7;
int N, M, K;
int p[805][805];
int dp[805][805][18][2];
LL ans;
int main(){
ios::sync_with_stdio(false);
int i, j, l;
cin >> N >> M >> K, K++;
for(i = 1; i <= N; i++)
for(j = 1; j <= M; j++)
cin >> p[i][j];
for(i = 1; i <= N; i++)
for(j = 1; j <= M; j++)
dp[i][j][p[i][j] % K][0]++;
for(i = 1; i <= N; i++)
for(j = 1; j <= M; j++){
for(l = 0; l < K; l++){
dp[i][j][(l + p[i][j]) % K][0] += dp[i - 1][j][l][1] + dp[i][j - 1][l][1];
dp[i][j][(l + p[i][j]) % K][0] %= MOD;
dp[i][j][(l - p[i][j] + K) % K][1] += dp[i - 1][j][l][0] + dp[i][j - 1][l][0];
dp[i][j][(l - p[i][j] + K) % K][1] %= MOD;
}
ans = (ans + dp[i][j][0][1]) % MOD;
}
cout << ans << endl;
return 0;
}