答案只可能是-1,0,1,2。
1.
先判断答案是否为0,相当于要判空格子是否连通。假如不连通,相当于有空格子被一些障碍点围住了(联想一下围棋。。)。那么我们按八连通把障碍的联通块搜出来,然后对于每个联通块,判断与他们八连通的空格子是否属于一个联通块(四连通),假如不是,则这幅图不连通。
2.
接下来答案为1相当于存在一个割点。首先做一些定义,与某个障碍点八连通的空格定义为1级空格,不是1级空格但与某个1级空格八连通的空格定义为2级空格。那么显然,割点只能是1级空格。接下来我们对1级空格以及2级空格建图,假如两个空格四连通那么连边,最后判断在新图是否存在是1级空格的割点即可。
注意在 n=1 或 m=1 的情况下答案最多为1。
首先要知道如何判断一个分数 xy 在 k 进制下是否是纯循环的。这等价于:
存在一个 l≠0 ,使得:
x×kl≡x(mody)
由于 (x,y)=1 ,那么等价于 kl≡1(mody) ,最终推出 (k,y)=1 。
那么原问题就变成了:
给定 n,m,k ,求出
那么转移有:
先把区间按长度排序,然后离散化。接下来枚举长度的右端点,显然左端点是单调不降的。这样两个指针扫,用线段树维护每个位置被多少个区间覆盖,合法性直接看最大值是否合法即可。
可以非常简单的弄出一个dp转移方程
这个Dp的复杂度是 O(N3P) 。然后很显然的,这条式子也可以看作
比较Trick的一个地方是,我们可以先用double求出每个 F[i][j] 是由哪个 k 转移过来的。最后再用高精度跑一遍。
复杂度变成了 O(N2+NP) ,不太能过。
最后的一个优化是,最优方案中,长度超过1的段数不会超过14( logNh )段,那么我们可以先Dp出前14层的答案(因为每一段的长度是递减的),最后再直接扫一遍计出答案就好了。
复杂度为 O(NlogNh+NP) 。
代码:
Day1 Grid
Day1 Cyclic
Day2 Drink