题目链接: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. Liferay 7:portlet name

    总结自: https://web.liferay.com/zh/web/user.26526/blog/-/blogs/proper-portlet-name-for-your-portlet-com ...

  2. HDU 1536 求解SG函数

    #include<stdio.h> #include<string.h> #include<algorithm> #include<set> using ...

  3. 媒体查询(media):设置PC端网页居中显示

    @media screen and (min-width: 768px){ body{ background-color: #EAEAEA; } #fater{ width: 640px; margi ...

  4. 阿里云linux服务器到期后续费,网站打不开解决方法之一

    续费后打不开网站,可能会出现不同情况,这里只记录我遇到的问题 问题描述:服务器到期后续费,网站打不开. 解决尝试: 1.重启服务器nginx    /etc/init.d/nginx restart ...

  5. MySQL数据库操作语句(cmd环境运行)

    一.开启MySQL服务器 1,  通过windows提供的服务管理器来完成 windows键+R 输入: services.msc 2.在本地服务中打开其服务 3.在DOC命令行下 net stop ...

  6. 读JS高性能总结——DOM编程(一)

    DOM是一个与语言无关的API,它在浏览器中的借口却是用JS来实现的. 浏览器通常会把DOM和JS独立实现. 在IE中,JS的实现名是JScript,位于jscript.dll文件中,DOM实现则是m ...

  7. 软件测试 → 第二章 基础-> 软件缺陷与缺陷管理

    一.缺陷定义与分类 1.1.软件缺陷 定义:在软件工程整个生命周期中任何背离需求.无法正确完成用户所要求的功能的问题,包括存在于组件.设备.或系统软件中因异常条件不支持而导致系统失败等都属于缺陷. 从 ...

  8. shell脚本练习题(更新中...)

    练习题(这里贴的是自己写的代码, 网上给的题目代码我会附加在最下面) 1. 编写shell脚本,计算1-100的和: #!/bin/bash #caculate the to `; do sum=$[ ...

  9. 洛谷 P2568 GCD(莫比乌斯反演)

    题意:$\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd(i,j)\epsilon prime]$. 对于这类题一般就是枚举gcd,可得: =$\sum_{d\epsilon prim ...

  10. 【Django入坑之路】基础操作(过滤,继承,跳转)

    1:自定过滤器 1创建templatetags文件夹 2在里面创建自定义py文件:固定格式: from django import template from django.utils.safestr ...