题目链接: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. 洛谷P1244 [NOI2000] 青蛙过河 [2017年4月计划 动态规划07]

    P1244 青蛙过河 题目描述 有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示.n只青蛙要过 ...

  2. js中的如何定位固定层的位置

    需要获取一些HTML的对象的坐标来更灵活的设置目标层的坐标,这里可以通过用到document.body.scrollTop等属性,但是这些属性在xhtml的标准网页中或更简单的说就是带<!DOC ...

  3. 洛谷 1447 [NOI2010]能量采集——容斥/推式子

    题目:https://www.luogu.org/problemnew/show/P1447 1.容斥原理 求 f [ i ] 表示 gcd==i 的对数,先 f [ i ] = (n/i) * (m ...

  4. 数据库通过sql备份脚本恢复时,报错误The user specified as a definer ('root'@'%') does not exist

    数据库通过sql备份脚本恢复时,报错误The user specified as a definer ('root'@'%') does not exist 当出现这个错误,意思是某个数据库对象的定义 ...

  5. LintCode 删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素每个元素只留下一个. 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3 ...

  6. C++ fstream文件操作

    代码如下: #include "stdafx.h" #include<string> #include<iostream> //是因为要使用cout #in ...

  7. Android Binder设计与实现 – 设计篇

    摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...

  8. CSS面试题总结2(转)

    1.你最喜欢的图片替换方法是什么,你如何选择使用. 图像替代,就是像我们在平时将文本添加到文本中,然后通过css隐藏文本并在它的位置上显示一个背景图片,这样,搜索引擎仍然可以搜到HTML文本,即使我们 ...

  9. Ui自动化测试框架

    为了提高我们的UI测试效率,我们引用Ui自动化测试框架,这里简单先描述一下,后续会详细补充: 了解一个测试框架,我们就需要了解一下源码,能看懂源码即可: 1.稳定先封装wait EC,电脑性能配置较好 ...

  10. iOS 适配iPhoneX上tableHeaderView发生了高度拉伸、UI出现的空白间距

    记录下前阵子遇到的一个问题,草稿箱里记录的有点潦草,讲下大概吧. 异常如下,粉色区域作为tableHeader放上去的(注意不是sectionHeader) header初始化之后一切正常,frame ...