<span>省选模拟56 题解</span>

A. 取石子游戏

容易发现这个问题的 $sg$ 值就是每堆的石子个数的异或和。

问题是后手能赢,也就是求删除 $d$ 的倍数个石子,使得剩余石子的异或和恰好为 $0$ 的方案数。

然后发现直接 $dp$ 复杂度就是 $O(n*d*\max(a_i))$ 的。

发现题面中给出了一个很特殊的限制,所以考虑如何做到每次 $O(d*a_i)$ 的转移。

容易发现给 $a_i$ 排个序就好了。

坑点是不能全删完,所以当 $d$ 是 $n$ 的因数的时候需要给答案减一个 $1$。

 

B. 路径计数

容易发现不同的询问个数并不多,所以这题肯定要预处理答案。

这样直接做一个 $dp$,复杂度就是 $O(n^4d)$的。

然后发现这个 $n^4$ 是枚举点对+枚举边,肯定后者省不掉,所以想一下怎么把枚举点对转化为枚举一个点。

比如枚举起点,那考虑弄一个容斥出答案。

现在不妨让路径上都不经过起点,那么只要钦定路径上出现若干个终点,即可容斥出路径上恰好出现 $0$ 次终点。

然后考虑每个钦定序列的方案数,发现这个玩意有两种形式。

设 $f(i,j,x,k)$ 表示由 $i$ 走 $k$ 步到达 $j$,路径上不能经过 $x$ 的方案数。

那么一个是 $f(s,t,s,k)$ ,一个是 $f(t,t,s,k)$ 。

前者直接做一下 $O(n^3d)$ 的 $dp$ 就完事了,后者再套一个类似的容斥即可转化为没有任何限制,也就是个直接 $dp$。

但是容斥的方法是枚举序列,这肯定不现实,容易发现只关心终点的最后一次出现,所以写成类似背包 $dp$ 的形式就好了。

 

C. 方格操作

考虑设 $f_x$ 表示第 $x$ 行 $1$ 出现次数的奇偶性, $g_x$ 同理表示列。

然后发现一***作之后,有 $col_{i,j}=f_i \ xor \ g_j$。

然后有一个想不到但挺显然的结论,就是说行、列的交换是不影响答案的。

那么发现把 $f,g$ 的两种取值分别移动到角落,第一***作之后,形成的就是四个矩形。

既然第一轮是矩形,以后的每一轮这个矩形始终存在,并且每个矩形中每个点的颜色是相同的。

所以直接模拟,因为只有四个矩形,当超过 $16$ 轮模拟仍然没有结束,那肯定就是操作无限次了。

所以问题只剩下如何求初始的 $f,g$ ,发现这个搞个扫描线就好了。

全部评论

相关推荐

11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务