1.题目
题目背景
(原创)
有一天 pb和zs玩游戏 你需要帮zs求出每局的胜败情况
题目描述
游戏规则是这样的: 每次一个人可以对给出的数进行分割,将其割成两个非零自然数,之后由另一个人选择留下两个数中的其中一个;之后由另一个人进行分割这个剩下的数,重复步骤……
当一个人无法对数进行分割的时候游戏结束,另一个人获胜
现在要你求出N次游戏的胜败
每局由pb先进行分割,如果pb赢输出"pb wins" 如果zs赢输出"zs wins"
注:双方都是绝顶聪明的
输入格式
第一行一个数N,表示数据组数
之后N行,每行一个数M,表示每局初始的数
输出格式
共N行,每行一串字符 表示游戏结果
样例输入 #1
5
1
3
7
20
5
样例输出 #1
zs wins
zs wins
zs wins
pb wins
zs wins
提示
1<N<50
1<=m<=1000000000
2.分析
博弈论
当n=1时,先手输
当n=2时,先手胜
假设当k=n(n>2时),奇数先手输,偶数先手胜
则当k=n+1时,
分为以下两种情况
(1)n+1为奇数,则先手只可将n+1分为一个奇数一个偶数,如果此时的后手想要赢,则此时后手选择偶数,则可套用假设,则后手胜,即先手输
(2)n+1为偶数,则先手可将n+1分为两个奇数或者两个偶数,此时先手想要赢,只可分为两个奇数,则后手会输,即先手赢
综上:
奇数,先手输
偶数,先手赢
3.代码
#include <iostream>
using namespace std;
int main()
{
scanf("%*d"); //读入一个数字
int n;
while (scanf("%d", &n) != EOF)
{
if (n & 1) puts("zs wins"); //奇数先手输后手赢
else puts("pb wins");
}
return 0;
}
4.总结
scanf返回值为读入的数据个数
位运算
5.更新日志
2022.7.27
欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~