nyoj-2359 巴什博弈?

2359: 巴什博弈?

时间限制: 1 Sec  内存限制: 30 MB
提交: 250  解决: 47
[提交][状态][讨论版]

题目描述

有n个石子,有两人轮流从中取石子,最少a个最多b个,谁没得取(即当轮到他取是已经没有石子可以取了,也就是说此时石子数量小于a)谁赢,现在,LLM先取,问你LLM能赢吗

输入

每个测试样例少于100000组测试数据

每组测试样例第一行三个整数n,a,b

1<=a<=b,n<=100000000

输出

如果LLM能赢,输出YES,否则输出NO

样例输入

1 1 1
2 1 2

样例输出

NO
YES

提示

来源

河南省多校脸萌第六场

题解(非原创):

巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果
n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。那么这个时候只要n%(m+1)!=0,先取者一定获胜。

当我没得取时输,也就是说当剩下大于等于a个石子少于2*a个石子的时候我必然输,其他必败态就是这个数量再加上(a+b)*k  k为常数

举例而言:

6 2 2

双方取一轮,剩下2个,该我取那自然我就输了

如果是

8 2 2

我可以先取二个把问题转化为:6 2 2的情况下对手先取,那自然他输

这么说吧:我们可以把给出的n分个类:

N%(a+b)<a

N%(a+b)<2*a

N%(a+b)>=2*a

对于第二种情况,我是必败的这个很好推

对于第一种情况,我可以通过取一个b变成:对面先取,状态是N%(a+b)<2*a

对于第三种情况,我可以取个大于等于a的数量变成:对面先取,状态是N%(a+b)==a

附ac代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <cmath>
 6 #include <cstdlib>
 7 using namespace std;
 8
 9 int main(){
10     int n,a,b;
11     while(~scanf("%d %d %d",&n,&a,&b)){
12         int k=n%(a+b);
13         if(k>=a&&k<2*a) printf("NO\n");
14         else printf("YES\n");
15     }
16     return 0;
17 }

当时做的时候,总想着判断条件和b也有关系,最后看了题解才知道只和a有关。

时间: 2024-10-13 21:54:33

nyoj-2359 巴什博弈?的相关文章

nyojb 2359 巴什博弈变形

http://acm.nyist.me/JudgeOnline/problem.php?id=2359 2359: 巴什博弈? 时间限制: 1 Sec  内存限制: 30 MB提交: 237  解决: 43[提交][状态][讨论版] 题目描述 有n个石子,有两人轮流从中取石子,最少a个最多b个,谁没得取(即当轮到他取是已经没有石子可以取了,也就是说此时石子数量小于a)谁赢,现在,LLM先取,问你LLM能赢吗 输入 每个测试样例少于100000组测试数据 每组测试样例第一行三个整数n,a,b 1<

hdu 2897(巴什博弈变形)

邂逅明下 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4069    Accepted Submission(s): 1872 Problem Description 当日遇到月,于是有了明.当我遇到了你,便成了侣.那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废话)小 t和所有世俗的人

HDU 2149————巴什博弈

Description 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金.现在等待他的,就是像FarmJohn一样的农田生涯. 要种田得有田才行,Lele听说街上正在举行一场别开生面的拍卖会,拍卖的物品正好就是一块20亩的田地.于是,Lele带上他的全部积蓄,冲往拍卖会. 后来发现,整个拍卖会只有Lele和他的死对头Yueyue. 通过打听,Lele知道这场拍卖的规则是这样的:刚开始底价为0,两个人轮流开始加价,不过每次加价的幅度要在1-N之间,当价格大于或等于

hdoj 2188 悼念512汶川大地震遇难同胞——选拔志愿者 【巴什博弈】

题意:... 策略:最简单的典型的巴什博弈. 代码: #include<stdio.h> int main() { int n, m; int t; scanf("%d", &t); while(t --){ scanf("%d%d", &n, &m); if(n%(m+1) == 0){ printf("Rabbit\n"); } else printf("Grass\n"); } } 题

hdu 2188 巴什博弈

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个, 后取者都能够一次拿走剩余的物品,后者取胜.因此我们发现了如何取胜的法则:如果 n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走 k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的 取法,那么先取者肯定获胜.总

hdu 1851 尼姆+巴什博弈

先在每堆中进行巴什博弈,然后尼姆 1 #include<stdio.h> 2 int main() 3 { 4 int T; 5 int i,n; 6 int ans,m,l; 7 scanf("%d",&T); 8 while(T--) 9 { 10 scanf("%d",&n); 11 ans=0; 12 for(i=1;i<=n;i++) 13 { 14 scanf("%d%d",&m,&l

hdu 1846 Brave Game (巴什博弈 最简单的博弈水题)

Brave Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6434    Accepted Submission(s): 4294 Problem Description 十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫<勇敢者的游戏>(英文名称:Zathura),一直到现在,我依然对于电影中的部分

杭电2188--悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)

悼念512汶川大地震遇难同胞——选拔志愿者 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6756    Accepted Submission(s): 4256 Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队,治疗和防疫的医护人

巴什博弈

这里有这样的一个游戏: 1.  本游戏是一个二人游戏; 2.  有一堆石子一共有n个: 3.  两人轮流进行; 4.  每走一步可以取走1…m个石子: 5.  最先取光石子的一方为胜: 如果游戏的双方使用的都是最优策略,请输出哪个人能赢. Input 输入数据首先包含一个正整数C(C<=100),表示有C组测试数据. 每组测试数据占一行,包含两个整数n和m(1<=n,m<=1000),n和m的含义见题目描述. Output 如果先走的人能赢,请输出“first”,否则请输出“second