Roy&October之取石子

题目背景

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

题目描述

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

现在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。

分析:
被xjh拉去做比赛。然后就去被虐。这道题显然,1,2,3,4,5是先手赢状态,6无论怎么选都不行,就是一个后手状态,以此类推,我们发现,如果先手能够一步拿到任何一个后手状态,就可以赢,然后我们发现每一个后手状态都是6k。

证明:
假设现在数为6k,我们已经证明出6a(a<k)为后手状态,那么要想拿出后手状态,显然要拿走6(k-a),而6(k-a)一定不是一个质数的乘方,分解质因数会有一个2和一个3,显然不可能。而且,假设先手拿走了数表示为6x+y(0<y<6,不为0,已证明),后手可以通过拿走6-y使得现在的数成为6的倍数,且小于原数。

代码:

var
 n,t,i:longint;
begin
 readln(t);
 for i:=1 to t do
  begin
   readln(n);
   if n mod 6=0 then writeln('Roy wins!')
                else writeln('October wins!');
  end;              
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值