2022.8.2 模拟赛

这篇博客探讨了博弈论中的石子取舍问题,通过分析先手必胜策略,提出了模运算和循环节的概念。文章指出,当石子数满足特定条件时,先手玩家可以通过特定策略确保胜利。此外,还讨论了装袋问题的解决方案,揭示了贪心策略可能导致错误答案的原因,并提出改进方法。最后,提到了一个涉及有限状态循环的数学问题,并给出了循环存在的证明思路。

T1 取石子

  我们就让甲先行动一步,则会产生先拿 aaa 和先拿 bbb 两种结果。这样问题就转化成了总数为 n−an - ana 或者 n−bn - bnb,乙先手问后手是否必败。我们令 fif_ifi 表示石子数位 iii 时先手是否必胜,则有:

fi=1−(fi−a∨fi−b) f_i = 1 - (f_{i - a} \lor f_{i - b}) fi=1(fiafib)

  这样直接递推显然不行,所以我们考虑找找规律。打表发现 fff 时循环的,所以我们考虑证明 fff 循环的性质(循环节时 a+ba + ba+b)。

  这个循环其实也挺显然的,要证循环那么就是证明 fa+b+i=fif_{a + b + i} = f_ifa+b+i=fi,那么分两种情况,如果 fi=0f_i = 0fi=0,那么后手必胜,那么在局面为 a+b+ia + b + ia+b+i 的时候只要乙和甲拿相反的东西就能让局面回到 fif_ifi,于是还是后手必胜: fa+b+i=fi=0f_{a + b + i} = f_i = 0fa+b+i=fi=0fi=1f_i = 1fi=1 的情况同理。

  于是我们可以在最开始把 nnn 模上 a+ba + ba+b,然后再进行处理(下文的 nnn 都是进行过取模操作之后的 nnn)。

  我们不妨设 a>ba > ba>b,在我们会发现,先手必胜的条件首先一个先显然的就是 n>max⁡(a,b)=an > \max(a, b) = an>max(a,b)=a,因为先手可以拿走 aaa,又因为 n∈[a,a+b)n \in [a, a + b)n[a,a+b),所以剩下的数等于 n−a∈[0,b)n - a \in [0, b)na[0,b),所以乙就不可能拿走任何东西了。

  所以,条件一:n∈[a,a+b)n \in [a, a + b)n[a,a+b)

  还有一个条件是 n∈[b,2b)∪[3b,4b)∪[5b,6b)∪⋯n \in [b, 2b) \cup [3b, 4b) \cup [5b, 6b) \cup \cdotsn[b,2b)[3b,4b)[5b,6b),也就是 n∈[(2k−1)b,2kb),k∈N∗n \in [(2k-1)b, 2kb), k \in N^*n[(2k1)b,2kb),kN,因为此时 n<an < an<a,所以双方都只能拿 bbb,所以只要是奇数个 bbb 就一定是先手赢。

  所以第二个条件 ⌊nb⌋mod  2=1\lfloor\frac n b\rfloor \mod 2 = 1bnmod2=1

  这样就是 O(1)O(1)O(1) 判断,然后我们就可以 O(T)O(T)O(T) 解决问题了。

T2

  考试的时候写的二分答案,结果 WAWAWA 了,二分答案的正确性不能保证:

hackhackhack100,90,84,55,47,44,41,41,30,30,5100, 90, 84, 55, 47, 44, 41, 41, 30, 30, 5100,90,84,55,47,44,41,41,30,30,5

w=189w = 189w=189 的时候第一次 100+84+5=189100 + 84 + 5 = 189100+84+5=189,第二次 90+55+44=18990 + 55 + 44 = 18990+55+44=189,第三次 47+41+41+30+30=18947 + 41 + 41 + 30 + 30 = 18947+41+41+30+30=189

w=190w = 190w=190 的时候第一次 100+90=190100 + 90 = 190100+90=190,第二次 84+55+47=18684 + 55 + 47 = 18684+55+47=186,第三次 44+41+41+30+30=18644 + 41 + 41 + 30 + 30 = 18644+41+41+30+30=186,第四次 555

  这样就不是单增的了,所以二分答案的正确性无法保证。但是为什么是错的呢,是因为每次装是贪心的装而不是 dpdpdp(背包)的装法,所以会首先把大的放进去,导致下一次有小的放不进去,会浪费空间。

  虽然不能直接二分答案,但是我们可以找到替代方案,我们可以证明对于 A=max⁡i=1naiA = \max\limits_{i = 1}^n a_iA=i=1maxnaiw+Aw + Aw+A 一定比 www 更优。因为在这种情况下,每一条船所装的袋数均不会下降。

  所以我们可以在二分答案过后再暴力验证答案周围的 AAA 个位置来确保是正确的。

T3

不知道为什么今天有两道循环的题。

  看这个数据范围 k≤1e9k \leq 1e9k1e9,似乎也没有什么算法能 hold 的注这个数据范围(除了一些 O(log⁡n)O(\log n)O(logn) 的小算法),所以我们还是打表找规律。

  我们发现其中有 20pts20pts20ptsn=1n = 1n=1 的时候,所以我们稍微手算几个自己造的样例就会发现 n=1n = 1n=1 的时候是会循环的,就比如:

4→3,1→2,2→2,1,1→3,1→⋯ 4 \to 3, 1 \to 2, 2 \to 2, 1, 1 \to 3, 1 \to \cdots 43,12,22,1,13,1

  所以我们考虑证明循环的正确性:

  因为石子个数有限,并且产生的所有情况下石子数量和都是固定的数字。又因为显然任意一个数字 mmm 的拆分数是有限的,所以情况数是有限的。所以只要 kkk 足够大,我们就必定会回到以前出现过的情况,也就会产生循环。

  现在的问题就在于循环节,如果循环节不是很长的话就可以直接打表了。

  然后就要证明循环节长度,但是 TJTJTJ 的证明是势能分析,然后我也没看懂,所以就不证了吧qwq。具体来说就是先要操作 S=∑i=1naiS = \sum\limits_{i = 1}^n a_iS=i=1nai 次进入循环节,然后循环节是 mx=max⁡i=1n(i+ai)−1mx = \max\limits_{i = 1}^n (i + a_i) - 1mx=i=1maxn(i+ai)1

T4

  考场上暴力都不会打…

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值