再来考虑
p
!
=
1
p!=1
p!=1的情况。因为
f
[
i
]
[
j
]
=
f
[
i
−
1
]
[
j
−
1
]
∗
b
+
f
[
i
−
1
]
[
j
]
∗
a
f[i][j]=f[i-1][j-1]*b+f[i-1][j]*a
f[i][j]=f[i−1][j−1]∗b+f[i−1][j]∗a,所以我们可以一列一列把所有答案求出来,即
n
∗
m
n*m
n∗m预处理,
O
(
1
)
O(1)
O(1)求。40分get。
还是p=1的情况,此时
n
,
m
<
=
500000
n,m<=500000
n,m<=500000。因此我们需要转换思路。画一个图,给某一行的每一列分别设定一个变量。递推表示一下,你发现,每一个
f
[
1
]
[
i
]
f[1][i]
f[1][i]对
f
[
x
]
[
y
]
f[x][y]
f[x][y]的贡献,即是
f
[
1
]
[
i
]
f[1][i]
f[1][i]本身乘上一个组合数,再乘上一个a的幂次和b的幂次。至于组合数具体是多少呢?很容易推出来,组合数是到达当前点的方案数吧,从上向下走,显然只有斜着走和正下方走,那么组合数为
C
x
−
1
y
−
i
C_{x-1}^{y-i}
Cx−1y−i。b的幂次即为斜着走的步数,显然为
y
−
i
y-i
y−i,那么a就是
x
−
1
−
y
+
i
x-1-y+i
x−1−y+i啦。okk,60分get。
100分的做法需要我们推一下,当x在p上面时,怎么算。考虑,假设我们要求
f
(
x
,
y
)
f(x,y)
f(x,y),它等于
f
(
x
+
1
,
y
)
−
f
(
x
,
y
−
1
)
∗
b
a
\frac{f(x+1,y)-f(x,y-1)*b}{a}
af(x+1,y)−f(x,y−1)∗b。这其实又变成了一个可以递推的式子,不断分解
f
(
x
+
1
,
y
)
和
f
(
x
,
y
−
1
)
f(x+1,y)和f(x,y-1)
f(x+1,y)和f(x,y−1)。直到
x
=
p
x=p
x=p停止。这仍然是一个组合数,只不过有正负区别。写一写,显然当列之间距离为奇数时,系数为负。否则为正。因为这次走法不同,只能向左或者向下,所以组合数是
C
p
−
x
+
y
−
i
−
1
p
−
x
−
1
C_{p-x+y-i-1}^{p-x-1}
Cp−x+y−i−1p−x−1,减1是因为最后一行不能向左走。从式子中可以看出,b仍然是需要乘的,但是a需要除。b的幂还是
y
−
i
y-i
y−i,a的幂变成
p
−
x
+
y
−
i
p-x+y-i
p−x+y−i。okk。
p
>
x
,
f
[
x
]
[
y
]
=
∑
i
=
1
y
f
[
p
]
[
i
]
∗
C
p
−
x
+
y
−
i
−
1
p
−
x
−
1
∗
b
y
−
i
a
p
−
x
+
y
−
i
p>x,f[x][y]=\sum_{i=1}^{y}\frac{f[p][i]*C_{p-x+y-i-1}^{p-x-1}*b^{y-i}}{a^{p-x+y-i}}
p>x,f[x][y]=i=1∑yap−x+y−if[p][i]∗Cp−x+y−i−1p−x−1∗by−i
p
<
x
,
f
[
x
]
[
y
]
=
∑
i
=
1
y
f
[
p
]
[
i
]
∗
C
x
−
p
y
−
i
∗
a
x
−
p
−
y
+
i
∗
b
y
−
i
p<x,f[x][y]=\sum_{i=1}^{y}f[p][i]*C_{x-p}{y-i}*a^{x-p-y+i}*b^{y-i}
p<x,f[x][y]=i=1∑yf[p][i]∗Cx−py−i∗ax−p−y+i∗by−i