石子游戏(博弈,规律
爱丽丝和鲍勃正在玩游戏。
有一堆石子,这堆里最初有N个石子。
游戏按照以下规则进行:
-
第1轮,爱丽丝可以从石子堆中取走不超过1个石子,但不能一个石子都不取。
-
第2轮,鲍勃可以从石子堆中取走不超过2个石子,但不能一个石子都不取。
-
第3轮,爱丽丝可以从石子堆中取走不超过3个石子,但不能一个石子都不取。
-
第4轮,鲍勃可以从石子堆中取走不超过4个石子,但不能一个石子都不取。
-
......
-
第i轮,轮到的玩家可以从石子堆中取走不超过i个石子,但不能一个石子都不取。
当某个玩家取走石子堆中的最后一个石子时,该玩家获得胜利。假设爱丽丝和鲍勃都会遵循最优策略,那么谁会胜利?
输入格式:
第一行输入1个整数T(1≤T≤105)。表示询问个数。
接下来T行,每行一个整数N(1≤N≤1018),表示这局的石堆有N个石子。
输出格式:
输出T行代表每个询问的答案。若爱丽丝胜利,输出"Alice"(不需要输出引号),否则输出"Bob"(不需要输出引号)。
输入样例:
3
1
2
4
输出样例:
Alice
Bob
Alice
N=4时,第1轮爱丽丝取走一个,第2轮无论鲍勃取走一个或者两个,第3轮爱丽丝都能把剩余的取完。
虽然不明白为什么
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int x=sqrt(n);
if(x<=n&&n<x*(x+1)) cout<<"Alice"<<'\n';
else cout<<"Bob"<<'\n';
}
return 0;
}