[BZOJ 4767] 两双手(容斥/DP)
作者:互联网
Problem
[#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
多做题!
标签:方案,两双手,复杂度,容斥,合法,vec,行走,障碍,DP 来源: https://www.cnblogs.com/BaseAI/p/14023516.html