zoukankan      html  css  js  c++  java
  • luogu2252 取石子游戏

    题目描述

    有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

    输入输出格式

    输入格式:

    输入共一行。

    第一行共两个数a, b,表示石子的初始情况。

    输出格式:

    输出共一行。

    第一行为一个数字1、0或-1,如果最后你是胜利者则为1;若失败则为0;若结果无法确定则为-1。

    输入输出样例

    输入样例#1: 复制
    8 4
    
    输出样例#1: 复制
    1
    

    说明

    [数据范围]

    50%的数据,a, b <= 1000

    100%的数据,a, b <= 1 000 000 000

    威佐夫博弈模型

    定义奇异情况为必败态

    发现有(0,0),(1,2),(3,5),(4,7),(6,10)可以看出,$a0=b0=0$,$ak$是未在前面出现过的最小自然数,而$bk=ak+k$

    $ak=[k(1+√5)/2],bk=ak+k(k=0,1,2,…,n方括号表示取整函数)$

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 int n,m;
     8 int main()
     9 {
    10   cin>>n>>m;
    11   double t=(1.0+sqrt(5))/2.0;
    12   double k=abs(n-m);
    13   if (min(n,m)==(int)(t*k)) printf("0");
    14   else printf("1");
    15 }

    可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k

  • 相关阅读:
    简单登录接口
    While循环猜年龄
    linux全面详细转载文章
    ansible
    Python之OS模块函数
    Python脚本-自动下载安装
    LVS(3种模式+10种调度算法)
    Dockerfile构建镜像
    Docker简易安装及命令实例
    find命令实例
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8522358.html
Copyright © 2011-2022 走看看