洛谷 P4018 Roy&October之取石子

                洛谷 P4018 Roy&October之取石子

题目背景

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。

(改编题)

题解:

其实结论很简单,

一.首先,1,2,3,4,5都可以一次取到,当n=6时,第一个人先取1-5个,无论怎么取,第二个人全去走就赢了。

二.对于6的倍数,一定不能是质数的K次方,证明:先是除2以外的质数都是奇数,而奇数乘奇数都是奇数,故6的倍数全不是n的K次方;对于2,由于6中存在因数3,故6*n也不是2的K次方。

三.对于12,第一个人取1-5个,第二个人直接取到剩下6个,就变成了情况一,第一个人取不到6个,若去6个以上,则直接败;

四.归纳6*n。第一个人无法去6的倍数个,第二个人只要将数压倒6*m(m<n)就会慢慢推到情况二,就又是第一个人输。

五。对于非6的倍数,第一个人只要去1-5个,使之变成6的倍数,就变成情况四了。

所以,只有当a为六的倍数时,Roy才能赢。

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int main(){
 5     int t,a;
 6     scanf("%d",&t);
 7     for(int i=1;i<=t;i++){
 8         scanf("%d",&a);
 9         if(a%6!=0)
10         printf("October wins!\n");
11         else
12         printf("Roy wins!\n");
13     }
14     return 0;
15 }
AC

      一世安宁

猜你喜欢

转载自www.cnblogs.com/GTBA/p/9097248.html