51NOD 1066 Bash游戏

1066 Bash游戏
《51NOD 1066 Bash游戏》 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 
难度:基础题

《51NOD 1066 Bash游戏》 收藏

《51NOD 1066 Bash游戏》 关注 有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。 例如N = 3,K = 2。无论A如何拿,B都可以拿到最后1颗石子。 Input

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
第2 - T + 1行:每行2个数N,K。中间用空格分隔。(1 <= N,K <= 10^9)

Output

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

Input示例

4
3 2
4 2
7 3
8 3

Output示例

B
A
A
B

这道题主要考察博弈论中的Bash Game,他是三个常见博弈论Bash Game,Nim Game和Wythoff Game中之一。 Bash Game问题描述:
巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取k个。最后取光者得胜。
分析:
设 n=(k+1)q+r ( 0≤r≤k )

①若 r=0, 后取者必胜,策略如下:
若先取者拿走 x 个,则后取者拿走 k+1-x 个,结果剩下 (k+1)(q-1) 个,保持这种取法,则后取者必胜。
②若 r≠0, 先取者必胜,策略如下:
先取者先拿走 r 个,若后取者拿走 x 个,则先取者拿走 k+1- x 个,结果剩下 (k+1)(q-1) 个,保持这种取法,则先取者必胜。

总之,要保持给对手留下(k+1)的倍数,就能最后获胜。

简单来说:

如果N是k+1的倍数,那么无论A取任意值,B只要取k+1-x即可保证必胜
同理,若N不是k+1的倍数,那么只要第一步取N % (k+1),然后就相当于AB换了身份,显然A必胜

参考的博客:http://blog.csdn.net/liuyanfeier/article/details/51317997

http://blog.csdn.net/suool/article/details/15777651

#include<iostream>

int main(int argc,char *argv)
{
    int T,N,K;
    std::cin>>T;
    while(T--)
    {
        std::cin>>N>>K;
        if(N%(K+1)==0) std::cout<<"B"<<std::endl;
        else std::cout<<"A"<<std::endl;
    }
    return 0;
}

点赞