FJNU2019级第二场排位赛D题Nim题解

蒟蒻第二篇题解

题目描述Alice和Bob两个熊孩子又开始玩游戏了,这次他们和往常一样玩一个叫Nim的游戏,但是他们都知道如何在这个游戏中以最优策略赢对方,因此他们将Nim游戏规则稍微修改了下,首先他们将多堆石子变成单堆石子,接着两个人轮流取石子,但是取石子是有限制的,Alice说必须要选择质数个石子,但是Bob不喜欢数字2并且特别喜欢数字1,因此他要求一定不能选择2两个石子,但是可以选择1个石子,拿走最后若干个石子的人赢。现在请你帮忙计算,如果他们都以最优的策略谁会赢呢?(当然Alice先手)输入输入包含多组样例,第一行一个数字T表示样例个数 (T <= 100)

对于每组样例只有一行一个数字n,表示他们玩的游戏石子的个数 (1 <= n <= 1e9 )

输出对于每组样例,只需要输出一个行,如果Alice赢则输出"Alice",否则输出"Bob"样例输入
1
10
样例输出
Bob

我做题是列举发现当n是奇数是,总是先手胜,而当n是偶数时,总是后手胜,现在来证明一下:当n是除2外的素数时,显然先手胜,此时n为奇数,当n是不是素数的奇数时,因为只能取素数或1,当先手取完剩下的石子数必是偶数,而大于2的偶数必能由两个质数相加所得,情况一:后手取的是素数个石子,那么剩下的石子数为素数个,先手可一次取完,先手胜,情况二:后手取1个石子时,先手也可以取1,然后剩下的石子数还是偶数,如此循环,最后剩下两个石子时,后手先取,且只能取1,剩一个,先手胜利,由此也可以看出有偶数个石子时先取的必输,所以当石子初始数为偶数时先手必输。

#include

using namespace std;

int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
    	int n;
    	cin>>n;
    	if(n&1) cout<<"Alice"<<endl;
    	else cout<<"Bob"<<endl;
    }
    return 0;
}

你可能感兴趣的:(FJNU2019级第二场排位赛D题Nim题解)