这道题题面有很强的暗示性,两个人交替代表0,1,之差暗示为相对值。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define ll long long
#define gc getchar()
using namespace std;
const int mod=1000000007;
const int N=805;
inline void qr(int &x)
{
x=0;char c=gc;
while(c<'0'||c>'9')c=gc;
while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
}
void qw(int x)
{
if(x/10)qw(x/10);
putchar(x%10+48);
}
int k,t;
inline int zw(int x){return (x%t+t)%t;}
inline void add(int &x,int y){x=(x+y)%mod;}
int f[N][N][16][2];
int a[N][N];
int main()
{
int n,m;qr(n),qr(m),qr(k);t=k+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
qr(a[i][j]),f[i][j][a[i][j]][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int z=0;z<=k;z++)
{
add(f[i+1][j][zw(z-a[i+1][j])][1],f[i][j][z][0]);
add(f[i+1][j][zw(z+a[i+1][j])][0],f[i][j][z][1]);
add(f[i][j+1][zw(z-a[i][j+1])][1],f[i][j][z][0]);
add(f[i][j+1][zw(z+a[i][j+1])][0],f[i][j][z][1]);
}
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
add(ans,f[i][j][0][1]);
qw(ans);puts("");
return 0;
}
最后一次更新于2020-05-13
0 条评论