```
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const ll base=50;//a>uim
ll dp[801][801][100][2],map[801][801];//0-a,1-uim
ll i,j,q,t;
ll N,M,K,tem,ans;
ll mov;
ll op(int x);
int main(){
ios::sync_with_stdio(false);
cin>>N>>M>>K;
K++;
for(i=1;i<=N;i++)
for(j=1;j<=M;j++){
cin>>map[i][j];
}
dp[1][1][base+map[1][1]%K][0]=1;
for(i=1;i<=N;i++)
for(j=1;j<=M;j++){
if(i==j&&i==1) continue;
dp[i][j][base+map[i][j]][0]=1;
for(q=base-2*K;q<=base+2*K;q++){
if(q>=base+2*K) continue;
if(q<=base-2*K) continue;
if(q>=base+K){
mov=q-K;
dp[i][j][mov][0]+=dp[i-1][j][q-map[i][j]][1];
dp[i][j][mov][0]+=dp[i][j-1][q-map[i][j]][1];
continue;
}
else if(q<=base-K){
mov=q+K;
dp[i][j][mov][1]+=dp[i-1][j][q+map[i][j]][0];
dp[i][j][mov][1]+=dp[i][j-1][q+map[i][j]][0];
continue;
}
else{
mov=q;
dp[i][j][mov][0]+=dp[i-1][j][op(q-map[i][j])][1];
dp[i][j][mov][0]+=dp[i][j-1][op(q-map[i][j])][1];
dp[i][j][mov][1]+=dp[i-1][j][op(q+map[i][j])][0];
dp[i][j][mov][1]+=dp[i][j-1][op(q+map[i][j])][0];
}
}
}
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
ans+=dp[i][j][base][1];
cout<<ans<<endl;
}
ll op(int x){
if(x<=base-K)
x+=K;
if(x>=base+K)
x-=K;
return x;
}
```
by Carloramia @ 2018-02-04 21:02:34