Bash Game-Plus
题目描述
巴什博弈:有一堆 个物品,两名玩家轮流从中拿取物品。每次至少拿 个,至多拿 个,不能不拿,最终将物品拿完者获胜。
我们给这个游戏增加一些规则:
有一堆 个物品,甲和乙轮流从中拿取物品,甲先拿。每次至少拿 个,至多拿 个,最终将物品拿完者获胜。
现在新加入一条规则:也可以不拿,但每当有一名玩家选择不拿物品时,接下来的 次操作中两名玩家都不可以不拿。
举个例子,当 时,如果甲在某一次操作中没有拿物品,那么接下来乙、甲、乙三轮都必须拿至少 件物品。然后又轮到甲了,这次甲就可以再次选择不拿。
甲乙两人一共进行了 次游戏。对于每次游戏,你需要告诉甲他有没有必胜策略。
输入格式
第一行两个正整数 。 时取消新增加的规则,但是也需要正常读入 。
接下来的 行,每行三个正整数 。
输出格式
对于每轮游戏,如果甲有必胜策略,那么输出 Yes
。否则输出 No
。
样例输入
6 0
2 2 2
3 2 2
4 2 2
7 2 3
13 2 6
14 2 6
样例输出
Yes
Yes
No
Yes
Yes
No
提示
对于所有数据:,
分析题目,如果去掉了 这个限制,那么就会变成一个大家很熟悉的问题。
这个问题的结论如下(知道的可以跳过)。
若 ,先手必败,否则先手必胜。
策略就是两个人每次拿到的和都为 ,先手肯定拿了前半段,后手拿了后半段。
这样整个 就被分成了若干个 段。
如果刚好整除,那么说明后手拿了最后一段的后半段,这肯定拿到了最后一个,所这个时候以先手必败。
先手必胜只需要一开始拿走 即可。
那么添加回 这个限制,接着便要尽可能的靠近上面的思路。
我们知道,先手在某一次不拿以后,肯定要过了 回才能再一次使用。
而过的这 回可以直接用前面的策略,也就是这些回每一回都会被拿走 个物品。
接着我们便可以把 分成若干个 段。
但实际上并不是,首先我们必须清楚,在前面的问题里,分成若干个 段是因为这些在下一次的选择权都在先手手上,而这个分段下一次的选择权却在后手手上。
所以我们把 分成若干个 段,这样每一段保证了先手必败,也有下一次的选择权。
接着便可以用 ,如下判断即可。
如果模数小于等于 ,可以直接判断,如果模数为 那么先手必胜,否则必败。
如果模数大于 ,那么这不就是 的情况吗,模一下 再判断等不等于 即可。
小证明:
如果最后模数为 ,那么一来就不取,根据一开始的结论,且我方为后手,所以必胜。
如果最后模数大于 ,那么一来先取一个,剩下的肯定不能被整除,且我方为接下来的后手(以剩下的为视角),理论上必败,但是还有一次不取的机会。
如果对方不取,那么我方变为先手(以不取过后,剩下的为视角),又因为不能整除,所以必胜。
如果对方要取,为了获胜,对方肯定会将剩下的数变为 的倍数,此时选择不取,因为剩下的数为 的倍数,且我方为后手(以不取过后,剩下的为视角),所以必胜。
这样你也知道为什么 不行了吧。
那么代码自然就出来了,时间复杂度 。
#include<bits/stdc++.h>
#define int long long
using namespace std;
void print(int x){
if(x) printf("Yes\n");
else printf("No\n");
return ;
}
signed main()
{
int t,op;scanf("%lld%lld",&t,&op);
while(t--){
int n,m,k;scanf("%lld%lld%lld",&n,&m,&k);
if(op) print(n%(m+1));
else if(k==1) print(1);
else{
__int128 round=(__int128)(m+1)*(k/2)+1;//这玩意竟然需要开__int128
int check=n%round;
if(check>1) check%=m+1,check=(check!=1);
print(check);
}
}
return 0;
}
一个你可能问的问题:为什么偏偏选择了 呢?
如果选择了其它的数,那么可能会导致大于等于 ,而 则没有这种烦恼。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)