传送门
本场唯一一道自己想出的题
洗澡的时候 \(YY\) 出正解
还有别问我为什么模数是这个
本人语文能力有限,喷轻点。。
可以说是本场最良心的题了,没有码量,部分分也很多
\(24\) 分暴力: \(n^2 DP\) 不讲
\(48\) 分暴力:容斥 \(O(k 2^k)\)
想到这里的同学已经是史诗级大佬了
易得:答案 \(=\) 总路径条数 \(-\) 非法路径条数
考虑没有障碍的情况:没有非法路径,答案即为总路径数
考虑有一个障碍 \(A\) : 答案 = 总路径条数 \(-\) 经过 \(A\) 的路径条数
考虑有两个障碍 \(A\) 和 \(B\):
非法路径数 = 经过 \(A\) 的路径数 \(+\) 经过 \(B\) 的路径数 \(-\) 同时经过 \(A\) 和 \(B\) 的路径数
答案 = 总路径条数 \(-\) 非法路径数
...... 以此类推
所以我们可以对障碍进行排序,再二进制枚举状态,容斥即可
因为模数是个质数,所以两点之间的路径数可以直接用组合数求出(然后用加乘原理瞎搞
需要注意的是有时同时经过多个点的状态不存在。这个点我在求组合数的时候顺便解决了
正解:
正解就是将求非法路径数的时间复杂度变为 \(O(k^2)\)
设 \(path(x1,y1,x2,y2)\) 表示从 \((x1,y1)\) 走到 \((x2,y2)\) 的路径数 (不考虑障碍)
设 \(g[i]\) 表示从第 \(i\) 个陷阱,不经过其他任何陷阱,到达 \((n,m)\) 的路径数
\(g[i] = path(x_i,x_j,n,m) -\) 经过其他陷阱的路径数
易得
\(g[i] = path(x_i,x_j,n,m)\) $ - \sum\limits_{j=i+1}^{n}{}$ \(path(x_i,y_i,x_j,y_j)\) \(\times\) \(g[j]\) \(\times\) \([y_j>=y_i]\)
对于每一条非法路径,都至少经过一个障碍
我们枚举每个障碍, \(path(0,0,x_i,y_i) \times g[i]\) 就为 经过的最后一个障碍为 \(i\) 的路径个数
然后相加即为非法路径条数
代码(巨丑无比)
完结撒花