zoukankan      html  css  js  c++  java
  • 洛谷 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!
    ");
    11         else
    12         printf("Roy wins!
    ");
    13     }
    14     return 0;
    15 }
    AC

          一世安宁

  • 相关阅读:
    QT 中如何实现一个简单的动画
    qt 中画线时如何设置笔的颜色和填充
    QT自定义窗口
    qt 中创建一个工作线程(例子)
    QT 获取系统时间
    火狐浏览器 system error code 1722 rpc服务器不可用和谷歌浏览器的插件application/x-print-ladop不支持
    ORA-10858:在要求输入数字处找到非数字字符
    eaeyui-combobox实现组合查询(即实现多个值得搜索)
    Mybatis中的模糊查询
    如何设置像我这样的博客的样式。
  • 原文地址:https://www.cnblogs.com/GTBA/p/9097248.html
Copyright © 2011-2022 走看看