1066 Bash游戏
基准时间限制:1 秒 空间限制:131072 KB 分值: 0
难度:基础题
收藏
关注 有一堆石子共有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;
}