51nod-1070-Bash遊戲 V4
阿新 • • 發佈:2019-01-26
題目描述
有一堆石子共有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
題解
典型的斐波那契博弈
http://blog.csdn.net/dgq8211/article/details/7602807
賣個安利可以好好看看這個大大寫的證明
中心思路:
1、如果x為斐波那契數,必敗,輸出B
2、如果x不是斐波那契數,必勝,輸出A
證明連結裡有quq
然後貼程式碼(本來想直接開個陣列沒想到記憶體爆了t t)
var n,x,i:longint;
f:array[0..1000000005] of boolean;
function check(x:longint):boolean;
var t,a,b:longint;
begin
a:=1;b:=1;
if x=1 then exit(true);
while (a+b<1000000000) do
begin
t:=a;a:=b;b:=t+a;
if t=x then exit(true);
end;
exit(false);
end;
begin
readln(n);
for i:=1 to n do
begin
readln(x);
if check(x) then writeln('B') else writeln('A');
end;
end.