有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量最少1个,最多不超过对手上一次拿的数量的2倍(A第1次拿时要求不能全拿走)。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。
例如N = 3。A只能拿1颗或2颗,所以B可以拿到最后1颗石子。
这是道经典 博弈斐波纳契博弈 知道就简单
再说这个之前先说一下斐波那契数列,这是1870年出来的老货。在数学上f(0)=0,f(1)=1,f(2)=1,f(3)=2……f(n)=f(n-1)+f(n-2)
再说一下“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。例如83=55+21+5+2,没错吧自己分解一下就行了
当石子为Fibonacci 数时,谁面对这种局势,谁输,证明就略了
#include<stdio.h>
bool panduan(int N){
int a,b,c;
//if(N==1)return true;
a=0;b=1;
c=1;
while(c<N){
c=a+b;
b=a;
a=c;
}
if(c==N)return false;
return true;
}
int main(){
int t,N;
scanf("%d",&t);
while(t--){
scanf("%d",&N);
if(panduan(N))
printf("A\n");
else printf("B\n");
}
}