【题目】BZOJ-4767 两双手

本文探讨了在无限大的棋盘上,一匹马从原点出发,避开多个禁止点,到达目标点的不同路径计数问题。通过向量分析与组合数学,结合容斥原理,提出了一种高效的动态规划解决方案。
题目大意

棋盘是一个无限大的二维平面,一开始马在原点(0,0)(0,0)(0,0)上。马有两种移动方式:

  1. (u,v)(u,v)(u,v)移动到(u+Ax,v+Ay)(u+A_x,v+A_y)(u+Ax,v+Ay)
  2. (u,v)(u,v)(u,v)移动到(u+Bx,v+By)(u+B_x,v+B_y)(u+Bx,v+By)

平面上有nnn个禁止点(坐标已给出),表示马不能走到这些点上。现在想知道马有多少种不同的移动方法到达点(Ex,Ey)(E_x,E_y)(Ex,Ey)。答案模109+710^9+7109+7

0⩽n,Ex,Ey⩽5000\leqslant n,E_x,E_y\leqslant 5000n,Ex,Ey500,所有数字的绝对值在500500500以内。
数据保证AxBy−AyBx≠0A_xB_y-A_yB_x\neq0AxByAyBx=0


思路

由于棋盘是无限大的,直接递推的方法已经不再适用。
先考虑没有禁止点的情况。
把两种移动方式抽象成两个向量a⃗=(Ax,Ay)\vec a=(A_x,A_y)a=(Ax,Ay)b⃗=(Bx,By)\vec b=(B_x,B_y)b=(Bx,By)。假设马从点PPP移动到点QQQ,可以得到一个方程:

λa⃗+μb⃗=PQ→\lambda\vec a+\mu\vec b=\overrightarrow{PQ}λa+μb=PQ

题目保证a⃗,b⃗\vec a,\vec ba,b不共线,根据平面向量基本定理,λ,μ\lambda,\muλ,μ的值是唯一的。若两者均为非负整数,则马可以从点PPP移动到点QQQ,两种移动方式分别需要λ\lambdaλ次、μ\muμ次。显然在没有禁止点的情况下移动的顺序是不影响最终位置的,所以方案数为

K(P,Q)=(λ+μ)!λ!μ!K(P,Q)=\frac{(\lambda+\mu)!}{\lambda!\mu!}K(P,Q)=λ!μ!(λ+μ)!

解读1: 总共有λ+μ\lambda+\muλ+μ次移动,假设所有移动各不相同,就有(λ+μ)!(\lambda+\mu)!(λ+μ)!中排列方式。其中有λ\lambdaλ次移动是相同的,这些移动的排列方式应该为111,这里却算作不同,把排列方式算作了λ!\lambda!λ!,需要除掉。另外μ\muμ次移动同理。
解读2: 总共有λ+μ\lambda+\muλ+μ次移动,选出其中λ\lambdaλ次进行第一种移动方式,方案数就为Cλ+μλC_{\lambda+\mu}^\lambdaCλ+μλ

然而这些移动方式中有一些经过了禁止点。设起点为OOO,终点为EEE,若MMM是禁止点,则经过点MMM的方案数就为K(O,M)⋅K(M,E)K(O,M)\cdot K(M,E)K(O,M)K(M,E),从总方案数中把所有经过禁止点的方案数减掉。
然而经过了两次禁止点的方案数被多减了一次,又把这些方案数加上……赤裸裸的容斥。
然而直接容斥的时间复杂度是O(2n)O(2^n)O(2n)。受不了。

回到上面那个方程。当PQ→=0⃗\overrightarrow{PQ}=\vec 0PQ=0时,λ=μ=0\lambda=\mu=0λ=μ=0,也就是说马在移动过程中不会回到之前已经经过的点。在容斥的过程中有n+2n+2n+2个关键点:起点、终点、nnn个禁止点。把这些点提出来,把从每个点出发能够到达的点与这个点用有向边相连,得到一张图,那么这张图一定是一个DAG,可以在上面DP。
定一个状态f[u][i]f[u][i]f[u][i]表示从起点走到uuu号点,并且经过iii个禁止点的方案数。最终答案就为

f[E][0]−f[E][1]+f[E][2]−f[E][3]+⋯+(−1)nf[E][n]f[E][0]-f[E][1]+f[E][2]-f[E][3]+\cdots+(-1)^nf[E][n]f[E][0]f[E][1]+f[E][2]f[E][3]++(1)nf[E][n]

写出方程就会发现时间复杂度是O(n3)O(n^3)O(n3)的。还是受不了。

由于容斥的时候f[u][i]f[u][i]f[u][i]的符号只与iii的奇偶性有关,不妨这样定状态:f[u][1]f[u][1]f[u][1]表示从起点走到uuu号点,并且经过奇数个禁止点的方案数,f[u][0]f[u][0]f[u][0]表示从起点走到uuu号点,并且经过偶数个禁止点的方案数。最终答案就为

f[E][0]−f[E][1]f[E][0]-f[E][1]f[E][0]f[E][1]

答案很简洁,并且DP的时间复杂度是O(n2)O(n^2)O(n2)

补充

记录一下老板的标解。
前面的思路类似。在容斥掉经过禁止点的方案的时候,不必奇加偶减,只需枚举方案中经过的第一个禁止点:枚举一个禁止点MMM,计算从起点到MMM不经过其它禁止点的方案(从MMM到终点可以经过其它禁止点),把这个方案减掉。这样,从起点到终点的每一个经过禁止点的方案只会在枚举到第一个禁止点的时候减掉。
状态为f[i]f[i]f[i],表示从起点走到iii号点,不经过其它禁止点的方案数。即用从起点到iii的所有方案数减去所有的f[j]×jf[j]\times jf[j]×jiii的方案数,其中jjjiii的上一步可能的点。妥妥的O(n2)O(n^2)O(n2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值