• Euclidean Nim(bzoj 4147)


    Description

    Euclid和Pythagoras在玩取石子游戏,一开始有n颗石子。
    Euclid为先手,他们按如下规则轮流操作:
    ·若为Euclid操作,如果n<p,则他只能新放入p颗石子,否则他可以拿走p的倍数颗石子。
    ·若为Pythagoras操作,如果n<q,则他只能新放入q颗石子,否则他可以拿走q的倍数颗石子。
    拿光所有石子者胜利。假设他们都以最优策略操作,那么获胜者是谁?
     

    Input

    第一行包含一个正整数t(1<=t<=1000),表示数据组数。
    接下来t行,每行三个正整数p,q,n(1<=p,q,n<=10^9),表示一组数据。
     

    Output

    输出t行。第i行输出第i组数据的答案,如果Euclid必胜,输出E,如果Pythagoras必胜,输出P,
    如果游戏永远不会停止,输出R。
     

    Sample Input

    4
    3 2 1
    2 3 1
    3 4 5
    2 4 3

    Sample Output

    P
    P
    E
    R

    HINT

    在第一组数据中,Euclid必须新放入3颗石子,然后Pythagoras拿走4颗石子并获胜。

    /*
      第一次写博弈论,这道题貌似很经典
      首先令d=gcd(p,q),如果d不整除n,那么显然无解。
      下面讨论有解的情况:
      ① p=q :显然先手必胜。 
      ② p>q&&n<p :先手第一次数量加p,后手可以把数量变成n%q,这样先手永远无法取石子,后手必胜。 
      ③ p>q&&n>=p :如果先手第一次取完石子,石子数量大于p,后手还是可以把数量变成n%q,后手必胜;
           否则,先手取成n mod p -> 后手+q -> 先手?p -> 后手+q -> ……,如果n%(p-q)=0,则先手必胜。
      ④ p<q&&n<p :先手第一次把数量变成n+p,如果n+p<q,就变成了第二种情况,否则是第三种情况。
      ⑤ p<q&&n>=p :那么先手可以把石子变成n%p,就变成了第二种情况。 
    */
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    bool ok(int n,int p,int q){
        return n%p<q&&n%p%(p-q)==0;
    }
    int main(){
        int T;scanf("%d",&T);
        while(T--){
            int p,q,n;
            scanf("%d%d%d",&p,&q,&n);
            int gcd=__gcd(p,q);
            if(n%gcd){
                printf("R
    ");
                continue;
            }
            p/=gcd;q/=gcd;n/=gcd;
            if(p==q) printf("E
    ");
            else if(p>q){
                if(n<p) printf("P
    ");
                else {
                    if(ok(n,p,q)) printf("E
    ");
                    else printf("P
    ");
                }
            }
            else {
                if(n<p){
                    if(n+p<q) printf("E
    ");
                    else {
                        if(ok(n+p,q,p)) printf("P
    ");
                        else printf("E
    ");
                    }
                }
                else printf("E
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    keil 提示"running with code size limit 32k"
    关于C语言编译出现give arg types警告问题
    windows10添加设备管理器的快捷方式到桌面
    deepin20社区版 安装 STM32CubeIDE 小记
    STM32开发 printf和scanf函数的重定向——修改HAL标准库用printf函数发送数据直接输出
    ardupilot环境配置之eclipse指定jdk版本启动,解决“Version XXXX of the JVM is not ......"报错的问题
    jdk9,10,11,12没有jre安装方法
    C++ 类构造函数 & 析构函数
    STM32 Keil中关于stlink的调试 下载设置
    STM32 SWD下载出现no target connect解决方法
  • 原文地址:https://www.cnblogs.com/harden/p/6296200.html
Copyright © 2020-2023  润新知