MiniLCTF2021 - 抓猫猫

没错这是我出的题(

但是也是搬的别人的 idea ,原来是 acm 题,出在 ctf 里有点算偏题 233

原题的题解:https://www.cnblogs.com/cdcq/p/12303889.html

但是这个题解的证明太罗嗦了,所以再写一次

题意:

两个人轮流抓猫。初始有 n 只猫,第一次最少抓 1 只,最多抓 n - 1 只。之后的每轮至少抓 1 只,至多不能超过上一次抓的数量。抓走最后一只猫的人胜利。电脑先抓且保证第一次抓不是最优解。

先上结论:n 是 2 的幂时后手必胜,否则先手必胜

证明:

考虑这个数的最低二进制位,即 lowbit ,例如 6 的 lowbit 是 2 ,12 的 lowbit 是 4

现在拿走 n 的 lowbit ,记为 b,讨论对方的做法,记拿的数为 a

① a = b

易证剩下的数 n - 2b 的 lowbit 还是 b ,下一步可以再拿 b

② a < b

由于 b 是 2 的幂,所以小于 b 且大于 1 的数必由小于 b 的二进制位组成

易证剩下的数 n - a - b 的 lowbit 一定小于 b,所以下一步必定可以拿走更小的 lowbit

因此每次必可以拿走当前数的 lowbit ,直至当前数为 1 为止,此时数的 lowbit 为自身,拿走即胜利

需要注意的是,对方任何时候都不可能拿走剩下的所有数,因为 n - lowbit(n) > lowbit(n)

而当初始数为 2 的幂的时候,没有 lowbit 可拿(最多拿 n - 1 ),此时拿任何数都会导致对方出现可拿的 lowbit ,因此必败

这道题的 3 个 hint 都是希望选手学习电脑的策略,从而找到必胜的规律

根据做题情况来看,大多数选手都是通过比较弱的结论来胜利,比如观察到奇数必胜,那么随便乱打,蹲一个奇数就可以了(虽然我尽可能地避免出现奇数,但是在必败态还是经常莫得选)

所以这题其实还有改进的空间,让人工智障的策略更具有迷惑性一些

不过 misc 题嘛,随便玩玩也是可以的,好玩就可以了

大家都认为这题作为 misc 签到题还是比较好玩的 hhh