题解 | #【模板】扩展巴什博弈#

【模板】扩展巴什博弈

https://www.nowcoder.com/practice/4b0d36a3d3884cf69f618cf4c2511d82

由于这是一个单一堆的博弈,不需要完整的 Sprague-Grundy 函数(XOR 和),仅需通过找规律推导 必胜态(N-position)必败态(P-position) 的分布周期即可。

定义状态为剩余石子数

  • P态(必败):当前局面的玩家注定失败(前提是对手走最优策略)。
  • N态(必胜):当前局面的玩家存在至少一种走法,能够将局面转移给对手,且转换后的局面是 P 态。

传统的巴什博弈(取 )的周期是 。本题增加了下限 。我们可以假设周期为

让我们验证模 的假设: 令 。 对于任意石子数 ,设

  • 假设 1:若 ,为 P态(必败)。

    • 证明
      • ,显然无法操作,必败。
      • (即 处于某个周期的开头段),玩家能做的操作是减去
      • 操作后,剩余石子
      • 在模 系统下,
      • 由于 ,减去 后,结果会“跨越”到上一个周期的后半段。推导表明,无论选哪个合法的 ,转移后的状态模值必然落在 范围内(即由P态只能走向N态)。对手获得了必胜态。
    • 结论:若当前模值在 ,先手无路可走或只能送给对手优越局面,为 NO
  • 假设 2:若 ,为 N态(必胜)。

    • 证明
      • 我们需要证明存在至少一种取法 ,使得取完后的石子数 ,其中 (即转移给对手 P态)。
      • 当前模值
      • 我们需要 落入 (逻辑上,或者落入更低周期的同余区间)。
      • 显然,取 (其中 )是可行的。
      • 因为 ,且 ,我们可以控制 的大小在 范围内,从而精确地将剩余石子数的模值控制在 之间。
    • 结论:若当前模值在 ,先手必胜,为 YES

最终结论

博弈结果呈现以 为长度的周期性分布:

  • 个状态(余数 )为必败。
  • 个状态(余数 )为必胜。

代码实现

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;

    while (T--) {
        ll n, l, r;
        cin >> n >> l >> r;

        ll k = n % (l + r);
        if (k < l) {
            cout << "NO\n";
        } else {
            cout << "YES\n";
        }
    }
}
#牛客新年AI问运#
每日一题@牛客网 文章被收录于专栏

牛客网每日一题

全部评论

相关推荐

02-12 20:22
重庆大学 Java
字节暑期刚入职四天,因为是年前,所以很多正职都放假走了,也就没有给我分配mt,然后有一个老哥在我来的时候给我发了一个landing手册,然后还有关于部门业务的白皮书,还有一些业务代码。然后本人是java面的,进来第一次接触go语言&nbsp;前面几天熟悉了一下go的语法和go的框架,可以读但是还不太会写,然后业务白皮书也看的很头疼,包括landing手册里要了解的很多东西说实话我看文档真的快看死了,一个嵌套一个,问题是我还完全不知道咋用这个我了解的东西,还有就是那个项目代码,那个老哥喊我去写写单测,熟悉一下go的语法,但也进行的很困难(这是我第一段实习,之前都是springboot那一套,真不太熟悉这个)想问问大家的建议,就是我从现在开始到在开年回来之前应该做些什么,我目前就一个想法&nbsp;就是复现一个landing手册上的go框架小项目&nbsp;就是相当于帮自己锻炼锻炼怎么写go&nbsp;或者各位大佬有没有更好的锻炼go语法的建议还有就是大家都在说vibe&nbsp;coding,那我应该怎么锻炼自己使用ai的能力,感觉我除了给一些需求然后它给我生成代码,好像就没别的用法了,那些什么工作流、拆解、skill啥的都不知道从哪一个地方开始,包括我现在正在实习,不知道精力该怎么分配,去网上想找找关于agent开发的一些学习流程,说实话,众说纷纭,有的是从python开始打基础然后系统学那些rag&nbsp;prompt&nbsp;langchain&nbsp;mcp等等,有的是说直接找一个github上的ai项目然后反复问ai,我确实有点迷茫,恳求各位大佬能留下你们宝贵的建议,我一定认真反复深刻学习有一说一&nbsp;我觉得字节饭挺好吃的!
双非后端失败第N人:1. go语言我建议你让ai带着你先把基本语法速通了,然后再去用go重新刷你以前刷过的leetcode,这样熟悉起来很快 2. 直接看你们组go项目,里面用***比较复杂,然后把每一个语法现象都喂给ai,一点点看
字节跳动公司福利 1371人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务