zoukankan      html  css  js  c++  java
  • 洛谷 Roy&October之取石子

    题目背景

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

    题目描述

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

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

    博弈论题首先找规律

    首先0 个石子的状态一定是必败态,因为对面在上一轮已经拿完了。

    观察1 ~5个石子,发现1=p0,2=21,3=31,4=22,5=51,都是必胜态,可以一次拿完赢得游戏。

    然后6个石子没办法一下拿完(因为6≠pk )。可以知道只能拿1 ~5个石子,这样都会转移到前面的必胜态,只不过这个必胜态已经是对面的了,所以说6 个石子是你的必败态,在你面前出现6个石子又轮到你拿的时候,你必定失败。

    这样一直往后找到12的时候,发现7 ~11 都是必胜态(一次把石子总数拿到6 个石子然后对面就输了),而12是必败态

    于是猜想所有6n6n6n 的状态是必败态,其余所有状态(6n+1,6n+2…6n+5)都是必胜态。

    我们采用数学归纳法证明:

    n=0时,结论成立,因为0 ~5 上面已经说明过了。

    现在假设0~6n−1 都满足结论。

    先证明6n为必败态:因为任何pk,都不是6 的倍数,所以6n个石子拿完一次不会还是6 的倍数,故必定转移到对面的必胜态,所以6n是必败态。

    显然6n+r(r=1,2…5) 只需要拿掉r便可以转移到6n ,是对面的必败态,所以6n+r(r=1,2…5)是必胜态。

    证毕。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        int T,x;
        for(scanf("%d",&T);T;T--){
            scanf("%d",&x);
            puts(x%6==0?"Roy wins!":"October wins!");
        }
        return 0;
    }
  • 相关阅读:
    postman接口测试01_下载安装
    Jenkins持续集成_05_参数化构建
    IntelliJ 中设置与Eclipse中 Ctrl+1 功能类似的快捷键
    JAVA 内部类
    Adobe Air 现在可支持X86的移动设备
    开发一些自动编写代码的工具可以增加效率吗?
    制作 Flex 悬停提示帮助文档(转)
    没什么好说的
    JDK,Tomcat,Maven,Mysql环境变量配置
    神器三、Android端神器东皇钟:天界之门
  • 原文地址:https://www.cnblogs.com/five20/p/8466867.html
Copyright © 2011-2022 走看看