题解 | #牛牛取石子#

牛牛取石子

https://ac.nowcoder.com/acm/contest/49888/D

本题解同步更新于我的博客欢迎围观★,°:.☆( ̄▽ ̄)/$:.°★

题意描述

一共有两堆石子,第一堆有 aa 个,第二堆有 bb 个,牛牛和牛妹轮流取石子,牛牛先手,每次取石子的时候只能从以下 22 种方案种挑一种来取(对于选择的方案数必须保证当前石子 \ge 取的石子个数才能取):

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

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

多组数据,(1T105,1a,b10181 \le T\le 10^5,1 \le a,b\le 10^{18})

做法分析

题中是两堆石子,但是我们可以先简化下,假如只有一堆石子是什么情况,就是说,有一堆石子,每次最多取2个,不能不取,最后取光者胜利,这样的胜负情况是怎么样的,也就是著名的巴什博弈

结论是,当石子不为33的倍数时,先手必胜。

现在我们再回到原题,发现其实我们只要讨论最小的内堆就行了,因为假设最小的内堆显示牛牛胜,无论牛妹怎么取,牛牛都可以和牛妹做相反取法,也就是牛妹取1,2(2,1)1,2(2,1),牛牛就取2,1(1,2)2,1(1,2),正好相反,这样的话最后肯定是最小的内堆先结束,再假设最小的内堆显示牛妹胜,牛妹同样会做和牛牛相反的取法,这时最小的时候同样会先结束。

那我们就考虑,牛牛先手能否造成牛妹取时是输的局面,也就是说牛牛能否让取后最小数变为33的倍数。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T;
int main()
{
	cin >> T;
    while(T--)
    {
        ll a, b;
        cin >> a >> b;
        if( min(a - 2, b - 1) % 3 == 0)
            printf("niuniu\n");
        else if( min(a - 1, b - 2) % 3 == 0)
            printf("niuniu\n");
        else printf("niumei\n");
    }
	
	return 0;
}
全部评论
为何不能一开始直接用min(a,b)%3==0判断
点赞 回复 分享
发布于 2023-03-02 16:59 河南

相关推荐

04-06 11:24
已编辑
太原学院 C++
点赞 评论 收藏
分享
评论
12
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务