题目背景

Roy和October两人在玩一个取石子的游戏。

题目描述

游戏规则是这样的:共有n个石子,两人每次都只能取 p^kpk 个(p为质数,k为自然数,且 p^kpk 小于等于当前剩余石子数),谁取走最后一个石子,谁就赢了。

现在October先取,问她有没有必胜策略。

若她有必胜策略,输出一行"October wins!";否则输出一行"Roy wins!"。

输入输出格式

输入格式:

第一行一个正整数T,表示测试点组数。

第2行~第(T+1)行,一行一个正整数n,表示石子个数。


输出格式:

T行,每行分别为"October wins!"或"Roy wins!"。

输入输出样例

输入样例#1:

3
4
9
14
输出样例#1:

October wins!
October wins!
October wins!

说明

对于30%的数据,1<=n<=30;

对于60%的数据,1<=n<=1,000,000;

对于100%的数据,1<=n<=50,000,000,1<=T<=100,000。

(改编题)

Solution:

  本题比较水。

  首先,不难发现$1,2,3,4,5$都是先手赢,到了$6$时就后手赢了,而对于大于$6$小于$12$的数,都能取$[1,5]$中的某个数,使其变为$6$,而到了$12$又是后手赢…

  直接告诉我们,$6$的倍数是先手必输状态,其余为先手必胜状态。

  首先,$6$的倍数一定不是某一质数的幂(这是显然的,因为$6=2\times 3$,所以$6$的倍数至少含两个质因子),所以$6$的倍数一定不能被一次取完。

  然后无论$6$的倍数怎么取,都至少取走一个非$6$的倍数的数,那么剩下的数必定为非$6$的倍数的数,我们只要从$[1,5]$中取某个值就能使得其又变为$6$的倍数。

  最后一定能够回到值为$6$且后手取的情况,此时后手无论取何值,都是输。

  所以只需判断一下是否是$6$的倍数就好了。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)>(b)?(b):(a))
using namespace std;
int T,n; il int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return f?-a:a;
} int main(){
T=gi();
while(T--){
n=gi();
if(n%==)puts("Roy wins!");
else puts("October wins!");
}
return ;
}

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. 洛谷P4018 Roy&October之取石子 题解 博弈论

    题目链接:https://www.luogu.org/problem/P4018 首先碰到这道题目还是没有思路,于是寻思还是枚举找一找规律. 然后写了一下代码: #include <bits/s ...

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

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

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

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

  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. HTML中的【块】与【内嵌】

    块元素与内嵌元素 块的特征 默认独占一行 没有宽度时默认撑满一行 支持所有的css命令 内嵌的特征 同行可以连续跟同类的标签 内容撑开宽度 不支持宽高 不支持上下的内外边距 代码换行被解析 块与内嵌的 ...

  2. Java中调用存储过程或函数

    //?代表一个参数,多个参数用逗号隔开 CallableStatement cs = connect.prepareCall("{?=call 存储过程名称或函数名(?)}"); ...

  3. 【php学习-4】

    var_1=11; print $var1->var_1.$var2->var_1; ?> print_Color(); ?> y=self::$x; # code... } ...

  4. hadoop2.7.2集群搭建

    hadoop2.7.2集群搭建 1.修改hadoop中的配置文件 进入/usr/local/src/hadoop-2.7.2/etc/hadoop目录,修改hadoop-env.sh,core-sit ...

  5. vuejs中的计算属性和监视

    计算属性 1.在computed属性对象中定义计算属性的方法,在页面上使用{{方法名}}来显示计算结果 2.通过getter/setter实现对属性数据的显示和监视 3.计算属性存在缓存,多次读取只执 ...

  6. BZOJ3265: 志愿者招募加强版(线性规划)

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 809  Solved: 417[Submit][Status][Discuss] Descriptio ...

  7. python2.7练习小例子(九)

        9)1.题目:暂停一秒输出.     程序分析:使用 time 模块的 sleep() 函数.     程序源代码: #!/usr/bin/python # -*- coding: UTF-8 ...

  8. MVC中输入的保护验证用:HttpServerUtility.HtmlEncode

    安全说明: 上面的代码使用HttpServerUtility.HtmlEncode来保护应用程序的恶意输入 (即 JavaScript).详细信息请参阅如何: 在 Web 应用程序,通过应用 HTML ...

  9. Gradle 设置本地meaven

    repositories { maven { url uri("F:\\meaven")} }

  10. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...