正解:$dp$
解题报告:
看到别的神仙在做就想着跟着做下$dp$的题目趴
然后发现还挺难的,,,反正我只大概想到怎么转移但是初始化什么的都不会$TT$
所以还是大概说下$QAQ$
首先可以想到设$f[i][j][k]$表示小$a$走到$(i,j)$的位置,与$uim$毒液值相差$j$的方案数 $g$表示$uim$
然后大力转移这里不难,大概写下式子
$f[i][j][k]=(f[i][j][k]+g[i-1][j][(k-a[i][j]+v)%v])%mod$
$f[i][j][k]=(f[i][j][k]+g[i][j-1][(k-a[i][j]+v)%v])%mod;$
$g$同理不想写了QwQ
关键在初始化,,,这个点反正我是没想到的(,,,我$jio$得$dp$我最差的差不多就是初始化,,,所以我爱记搜
初始化是这样的,首先看到这道题给的条件:
可以从任意一个格子开始,而且必须是小a开始
所以我们只用对小$a$的$f$初始化一下,$f[i][j][a[i][j]%v]=1$就好
哦还有一个小注意点还是港下,就是,思考一下第三维要不要开两倍鸭
答案是不要,为什么呢,因为它都是在$mod\ v$意义下的,所以$-k=-k+v$,$get$?
没啦!
最后计数算方案什么的还是挺简单的?不想说了$QwQ$
# include <bits/stdc++.h>
using namespace std;
#define ll int
#define rg register
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i)
const ll N=800+10,P=20,mod=1000000007;
ll f[N][N][P],g[N][N][P],as,n,m,p,fld[N][N];
inline ll read()
{
rg ll x=0;rg bool y=1;rg char ch=getchar();
while(ch!='-' && (ch>'9' || ch<'0'))ch=getchar();
if(ch=='-')y=0,ch=getchar();
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
return y?x:-x;
}
int main ()
{
n=read();m=read();p=read()+1;rp(i,1,n)rp(j,1,m)fld[i][j]=read()%p,f[i][j][fld[i][j]]=1;
rp(i,1,n)
rp(j,1,m)
{
rp(k,0,p-1)
{
f[i][j][k]=((f[i][j][k]+g[i][j-1][(k-fld[i][j]+p)%p])%mod+g[i-1][j][(k-fld[i][j]+p)%p])%mod;
g[i][j][k]=((g[i][j][k]+f[i][j-1][(k+fld[i][j])%p])%mod+f[i-1][j][(k+fld[i][j])%p])%mod;
}
as=(as+g[i][j][0])%mod;
}
printf("%d\n",as);
return 0;
}
做完题之后上来$repo$一个神坑点,,,
你以为$v$就是膜数嘛,,,仔细看下题,,,$v+1$才是膜数啊,,,然后样例还奇水无比我开始没发现样例也过了然后惨遭爆零$TT$
啊还有,,,就是,这题也不能开$ll$,会$MLE$昂,,,