[BZOJ 4767] 两双手(容斥/DP)

Problem

[#4767.两双手] 题目地址

[#3782. 上学路线] 题目地址 一道很像的题。

Solution

将两个行走方式看做两个二维向量 \(\vec{A},\vec{B}\),令其为该向量空间的基,对该空间变换后,得到每个禁止点的新坐标和终点的新坐标。

可以发现从一个点 \(u(u_1,u_2)\) 走到另外一个点 \(v(v_1,v_2)\)行走步数是唯一的(由于基向量线性组合时 \(a\vec{A} + b\vec{B}\) 系数 \(a,b\) 为正),假设走法一用了 \(x\) 次,走法二用了 \(y\) 次,那么 \(u\)\(v\) 随意行走的方案数(可以经过障碍点)就有 \(\dbinom{x+y}{x}\) 种。

对于所有的障碍点,对其总行走步数 \(z(x+y=z)\) 从小到大排序。特别的,令 \((0,0)\) 为第 \(0\) 个障碍点,终点为第 \(n+1\) 个障碍点。

\(f[i]\) 表示从 \((0,0)\) 到第 \(i\) 个障碍点,并且中间不经过障碍点的方案数,\(g(i,j)\) 表示从第 \(i\) 障碍点到第 \(j\) 个障碍点随意行走的方案数。

考虑全集:(从 \((0,0)\) 到第 \(i\) 个障碍点随意行走的方案数)为 \(g(0,i)\)(其中包含不合法方案)。

考虑不合法方案

  • 不合法方案至少经过 \([1,i-1]\) 中的一个障碍点,可以用第一个经过的障碍点为划分依据,将不合法方案的集合划分,故不合法方案数为 \(\sum^{i-1}_j f[j]*g(j,i-1)\)

综上,则有:

\[f[i] = g(0,i)-\sum^{i-1}_j f[j]*g(j,i-1) \]

则答案为 \(f[n+1]\)

\(g(i,j)\) 可以用组合数预处理出来,复杂度 \(O(n^2)\)。计算 \(f[n+1]\) 复杂度 \(O(n^2)\)。时间复杂度 \(O(n^2)\)

Code

Talk...

第一道题要用线性代数做一步转换,第二道题要 \(Lucas\) 加中国剩余定理,暂时不会码,哭了。

Summary

多做题!

posted @ 2020-11-23 11:29  基地AI  阅读(115)  评论(0编辑  收藏  举报