1070 Bash游戏 V4 

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

 收藏

 关注

有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量最少1个,最多不超过对手上一次拿的数量的2倍(A第1次拿时要求不能全拿走)。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。

例如N = 3。A只能拿1颗或2颗,所以B可以拿到最后1颗石子。

Input

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)

Output

共T行,如果A获胜输出A,如果B获胜输出B。

Input示例

3
2
3
4

Output示例

B
B
A

思路

斐波那契博弈,当石子数量为斐波那契数的时候,先取者处于必败态

证明:根据zeckendorf定理齐肯多夫定理):任何正整数都可以表示成若干个不连续的斐波那契数(不包括第一个斐波那契数)之和。

若n不是Fib数,则n可被分解为多个不连续Fib数,设其可分为a,b,c三堆(a>b>c)。

A在第一步先拿走堆c。

考虑谁能先拿完倒数第二堆:设倒数第二堆个数为Fib(n),首先,因为Fib(n)>2*Fib(n-2),B不可能一次拿完倒数第二堆。若B拿走的石子数大于等于Fib(n-2),则剩余石子必然可被A一次拿完。若B拿走的石子数为x<Fib(n-2),则有Fib(n)-x必然不是Fib数,将(Fib(n)-x)视作一个子游戏,由归纳假设知,A必在子游戏中获胜。因此无论如何,拿完倒数第二堆的都是A。如此递推,知A必胜。

证得若n不是Fib数,则A必胜。

在上方对于子游戏的考虑中,实际已蕴含了证明若n为Fib数,则A必败。

证明过程来自知乎https://zhuanlan.zhihu.com/p/21706111

AC代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ull unsigned long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x7f7f7f7f
#define lson o<<1
#define rson o<<1|1
const double E=exp(1);
const int maxn=1e2+10;
const int mod=1e9+7;
using namespace std;
int a[maxn];
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
a[0]=1;a[1]=1;
map<int,int>mp;
mp[1]=1;
for(int i=2;i<=45;i++)
{
a[i]=a[i-1]+a[i-2];
mp[a[i]]=1;
}
int t;
int n;
cin>>t;
while(t--)
{
cin>>n;
if(mp[n])
cout<<"B"<<endl;
else
cout<<"A"<<endl;
}
return 0;
}

51Nod 1070:Bash游戏 V4(斐波那契博弈)的更多相关文章

  1. 51nod 1070 Bash游戏 V4 (斐波那契博弈)

    题目:传送门. 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗: 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的 ...

  2. 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

    Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...

  3. HDU.2516 取石子游戏 (博弈论 斐波那契博弈)

    HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...

  4. 51Nod 1070 Bash游戏 V4(斐波那契博弈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...

  5. HDU 2516 取石子游戏(斐波那契博弈)

    取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  6. 题解报告:hdu 2516 取石子游戏(斐波那契博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个, ...

  7. hdu 2516 取石子游戏 (斐波那契博弈)

    题意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍. 取完者胜,先取者负输出"Second win",先取者胜 ...

  8. 51nod 1070 Bash游戏 V4

    这种博弈题  都是打表找规律 可我连怎么打表都不会 这个是凑任务的吧....以后等脑子好些了 再琢磨吧 就是斐波那契数列中的数 是必败态 #include<bits/stdc++.h> u ...

  9. ICG游戏:斐波那契博弈

    描述: 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗: 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍: ...

  10. hdu2516-取石子游戏 (斐波那契博弈)【博弈 二分查找】

    http://acm.hdu.edu.cn/showproblem.php?pid=2516 取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

随机推荐

  1. startActivityForResult的用法,以及intent传递图片

    开启startActivityForResult. Intent intent = new Intent(); intent.setClass(MainActivity.this, MipcaActi ...

  2. memory prefix out omni,over,out,od,octa ~O

    1● omni 全部 ,到处:     2● over 过度,超过,出去,翻转   3● out 超过,过去,过分, 在~之上,   4● od 逆,倒 :加强 的 意思   5● octa   八

  3. 20 KMP匹配的Next值和Nextval值

     i       0    1    2    3    4    5    6    7    8 s     a    b    a    b    a    a    b    a    b n ...

  4. jvm常用参数

    -Xms512m:初始堆内存 -Xmx512m:最大堆内存 -XX:PermSize=256m:初始永久代内存(方法区,非堆) -XX:MaxPermSize=256m:最大永久代内存(方法区,非堆) ...

  5. java编写本月日历

    代码如下: import java.time.*; public class Main { public static void main(String arg[]){ LocalDate date ...

  6. update-alternatives关键解疑

    update-alternatives的用法网上到处又有,但有2个知识点好像都没怎么提到: 1.--install 里的参数link到底是啥意思,其实update-alternatives本质就是在/ ...

  7. 1.1最简单的socket连接

    socket 服务器代码 # -*- coding: utf-8 -*-from socket import * myHost = '' #''说明所有IP都可以连接 myPort = 50007 # ...

  8. 四则运算 来源:一位热心的网友 http://www.tqcto.com/article/software/336297.html

    功能:实现真分数的四则运算 语言:Java  平台:JDK下的eclipse github地址:https://github.com/yeershao/hello-world/commit/9920a ...

  9. 2017-2018-2 20165214 实验四《Android开发基础》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:朱文远 学号:20165214 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:15:35 - 17:15 实验序号:四 ...

  10. JavaScript , js 上下文(this 的指代)

    上下文 代表 this 变量的值, 以及 它的 指代; 它决定一个函数怎么被调用; 当一个函数作为一个对象的方法被调用的时候, this总是指向 调用这个方法的对象. ----- 1 ,情况一: 字面 ...