题目链接:https://www.luogu.org/problem/P4018

首先碰到这道题目还是没有思路,于是寻思还是枚举找一找规律。

然后写了一下代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 101;
bool win[maxn];
bool isp(int a) {
if (a < 2) return false;
for (int i = 2; i * i <= a; i ++)
if (a % i == 0)
return false;
return true;
}
void check(int n) {
win[n] = false;
if (!win[n-1]) {
win[n] = true;
return;
}
for (int p = 2; p <= n; p ++) {
if (!isp(p)) continue;
for (int q = 1; q <= n; q *= p) {
if (win[n-q] == false) {
win[n] = true;
return;
}
}
}
}
int main() {
for (int i = 1; i < maxn; i ++) {
check(i);
printf("check (%d) ", i);
puts(win[i] ? "YES" : "NO");
}
}

输出结果如下:

check (1) YES
check (2) YES
check (3) YES
check (4) YES
check (5) YES
check (6) NO
check (7) YES
check (8) YES
check (9) YES
check (10) YES
check (11) YES
check (12) NO
check (13) YES
check (14) YES
check (15) YES
check (16) YES
check (17) YES
check (18) NO
check (19) YES
check (20) YES
check (21) YES
check (22) YES
check (23) YES
check (24) NO
check (25) YES
check (26) YES
check (27) YES
check (28) YES
check (29) YES
check (30) NO
check (31) YES
check (32) YES
check (33) YES
check (34) YES
check (35) YES
check (36) NO
check (37) YES
check (38) YES
check (39) YES
check (40) YES
check (41) YES
check (42) NO
check (43) YES
check (44) YES
check (45) YES
check (46) YES
check (47) YES
check (48) NO
check (49) YES
check (50) YES
check (51) YES
check (52) YES
check (53) YES
check (54) NO
check (55) YES
check (56) YES
check (57) YES
check (58) YES
check (59) YES
check (60) NO
check (61) YES
check (62) YES
check (63) YES
check (64) YES
check (65) YES
check (66) NO
check (67) YES
check (68) YES
check (69) YES
check (70) YES
check (71) YES
check (72) NO
check (73) YES
check (74) YES
check (75) YES
check (76) YES
check (77) YES
check (78) NO
check (79) YES
check (80) YES
check (81) YES
check (82) YES
check (83) YES
check (84) NO
check (85) YES
check (86) YES
check (87) YES
check (88) YES
check (89) YES
check (90) NO
check (91) YES
check (92) YES
check (93) YES
check (94) YES
check (95) YES
check (96) NO
check (97) YES
check (98) YES
check (99) YES
check (100) YES

发现只要不是 \(6\) 的倍数就是必胜态,只要是能被 \(6\) 整除就是必败态。

找到规律之后编写如下代码AC:

#include <bits/stdc++.h>
using namespace std;
int T, n;
int main() {
cin >> T;
while (T --) {
cin >> n;
puts( n % 6 ? "October wins!" :"Roy wins!" );
}
return 0;
}

然后来证明:

首先我们知道,所有 \(6^k\)(其中 \(k\) 为任意自然数)都不会是 \(p^k\) (其中 \(p\) 是素数)。

然后我们假设前 \(6 \times n\) 个状态已经确定了,并且所有的 \(6\) 的倍数都是必败态,其它状态都是必胜态。

然后因为 \(6n+1, 6n+2, 6n+3, 6n+4, 6n+5\) 都可以转换到必败态 \(6n\) ,所以这5个都是必胜态。

而 \(6n+6\) 不能转换到 \(6n, 6n-6, \dots 6, 0\) ,所以 \(6n+6\) 无论如何取都只能达到必胜态,所以 \(6n+6\) 就是必败态。

综上所述:所有 \(6\) 的倍数都是必败态,其他状态都是必胜态。

洛谷P4018 Roy&October之取石子 题解 博弈论的更多相关文章

  1. 洛谷 P4018 Roy&October之取石子

    洛谷 P4018 Roy&October之取石子 题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取 p^kpk 个(p为质 ...

  2. 洛谷——P4018 Roy&October之取石子

    P4018 Roy&October之取石子 题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取p^kpk个(p为质数,k为自 ...

  3. 洛谷P4018 Roy&October之取石子

    题目背景 \(Roy\)和\(October\)两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有\(n\)个石子,两人每次都只能取\(p^k\)个(\(p\)为质数,\(k\)为自然数,且 ...

  4. 洛谷P4860 Roy&October之取石子II 题解 博弈论

    题目链接:https://www.luogu.org/problem/P4860 和<P4018 Roy&October之取石子>一样的推导思路,去找循环节. 可以发现:只要不能被 ...

  5. luogu P4018 Roy&October之取石子(博弈论)

    题意 题解 如果n是6的倍数,先手必败,否则先手必胜. 因为6*x一定不是pk 所以取得话会变成6*y+a的形式a=1,2,3,4,5: 然后a一定为质数.我们把a取完就又成为了6*x的形式. 又因为 ...

  6. P4018 Roy&October之取石子

    题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取 p^kpk 个(p为质数,k为自然数,且 p^kpk 小于等于当前剩余石子数), ...

  7. 洛谷 Roy&October之取石子

    题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取pk 个(p为质数,k为自然数,且pk小于等于当前剩余石子数),谁取走最后一个石子 ...

  8. [luogu4018][Roy&October之取石子]

    题目链接 思路 这个题思路挺巧妙的. 情况一: 首先如果这堆石子的数量是1~5,那么肯定是先手赢.因为先手可以直接拿走这些石子.如果石子数量恰好是6,那么肯定是后手赢.因为先手无论怎样拿也无法直接拿走 ...

  9. [luogu4860][Roy&October之取石子II]

    题目链接 思路 这个题和上个题类似,仔细推一下就知道这个题是判断是否是4的倍数 代码 #include<cstdio> #include<iostream> #define f ...

随机推荐

  1. Leetcode74. Search a 2D Matrix搜索二维矩阵

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: matrix ...

  2. 【扩展推荐】Laravel-ide-helper 高效的 IDE 智能提示插件 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 - Powered by PHPH

    说明# barryvdh/laravel-ide-helper 扩展包能让你的 IDE ( PHPStorm, Sublime ) 实现自动完成.代码智能提示和代码跟踪等功能,大大提高你的开发效率. ...

  3. jquery tooltip.js

    1.引用关联的js脚本 <script type="text/javascript" src="script/jquery-1.3.2.min.js"&g ...

  4. vue使用填坑之:model和v-model的区别

    v-model通常用于input的双向数据绑定 <input v-model="parentMsg">,也可以实现子组件到父组件数据的双向数据绑定:首先说说v-mode ...

  5. 牛人也得看的CSS常识

    1.不要使用过小的图片做背景平铺.这就是为何很多人都不用 1px 的原因,这才知晓. 宽高 1px 的图片平铺出一个宽高 200px 的区域,需要 200*200=40, 000 次,占用资源. 2. ...

  6. git安装方法

    点击 http://git-scm.com/download 选择你使用的操作系统,如果是linux就可以看到命令行,windows则是下载客户端

  7. Directx11教程(34) 纹理映射(4)

    原文:Directx11教程(34) 纹理映射(4)     本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化. 原始的代码是:     ...

  8. input输入框限制录入类型

    输入大小写字母.数字.下划线:<input type="text" onkeyup="this.value=this.value.replace(/[^\w_]/g ...

  9. 洛谷P2607 骑士

    题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...

  10. photoshop正确的打开方式

    首先这边我先贴一个地址:https://www.adobe.com/cn/products/photoshop.html 安装软件,这里就不赘述了,真的不会,可以百度^_^我当初就是百度的,哈哈 说到 ...