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;
    }
  • 相关阅读:
    win8/10 bcdboot引导修复命令的原理和使用方法
    DD命令做备份和恢复
    基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理
    工资计算方式
    什么样的辞职理由能让面试官满意
    使用sql删除数据库中的重复数据,只保留分组后的第一条数据
    mysql实现row_number()和row_number() over(partition by)
    c# dev Gridcontrol绑定多层list
    窗体高度获取,随机调整窗体展示的位置
    consul下载地址
  • 原文地址:https://www.cnblogs.com/five20/p/8466867.html
Copyright © 2011-2022 走看看