KSzsh

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

牛牛取石子(对称策略/模拟棋)

题目链接

题目描述:

牛牛和牛妹在玩游戏,他们的游戏规则是这样的:
一共有两堆石子,第一堆有 a 个,第二堆有 b 个,牛牛和牛妹轮流取石子,牛牛先手,每次取石子的时候只能从以下 2 种方案种挑一种来取(对于选择的方案数必须保证当前石子 取的石子个数才能取):

  1. 第一堆取 1 个,第二堆取 2
  2. 第一堆取 2 个,第二堆取 1

谁先无法取石子,谁就输了。假设牛牛和牛妹都很聪明,请问谁会获胜?

输入描述:

第一行输入一个正整数 T(1T105),代表数据组数。

接下来 T 行,每行输入两个整数 a,b(1a,b1018)代表两堆石子的数量。

输出描述:

对于每组数据,输出一行,代表胜利者的名字(牛牛获胜输出niuniu,牛妹获胜输出niumei)。

样例:

input:

2
1 2
3 3

output:

niuniu
niumei

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int T = 1;
void solve()
{
LL a, b;
scanf("%lld%lld", &a, &b);
int r = min(a, b) % 3;
// 如果小的那一堆石子除以3的余数不是0,那么先手只要拿一个或者两个则必定让那堆石子的数量是3的倍数
// 那么后手不管怎么取,先手只要选择相反的操作那么两堆石子数量都是减3
// 所以后手必定会先遇到石子被取光的情况
if(r % 3)
{
// 但是有特殊情况,如果余数是1且两堆石子数量相同
// 一堆石子取1,则另一堆石子的数量就会更少且除以3的余数为2
// 这时候根据上面的结论,后手必胜
if(r % 3 == 1 && a == b)
cout << "niumei" << '\n';
else
cout << "niuniu" << '\n';
}
// 如果小的那一堆石子除以3的余数是0,那么只要后手选择与先手相反的操作每次两堆石子数量都是减3
// 所以先手肯定先会遇到石子数量为0的情况(不论两堆石子一开始的数量是否相等)
else
{
cout << "niumei" << '\n';
}
}
int main()
{
scanf("%d", &T);
while(T --)
solve();
return 0;
}

posted on   KSzh  阅读(178)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示