本场唯一一道自己想出的题
洗澡的时候 (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)) $ - sumlimits_{j=i+1}^{n}{}$ (path(x_i,y_i,x_j,y_j)) ( imes) (g[j]) ( imes) ([y_j>=y_i])
对于每一条非法路径,都至少经过一个障碍
我们枚举每个障碍, (path(0,0,x_i,y_i) imes g[i]) 就为 经过的最后一个障碍为 (i) 的路径个数
然后相加即为非法路径条数
完结撒花