【ACWing】1318. 取石子游戏

该博客讨论了一个名为巴什游戏(BashGame)的问题,其中两个玩家轮流从一堆石子中取走1到K个石子,目标是取完所有石子。当(K+1)不整除石子总数N时,先手有必胜策略;否则,后手有必胜策略。给出的C++代码实现用于判断先手是否能获胜,并在O(1)的时间复杂度内得出结果。
摘要由CSDN通过智能技术生成

题目地址:

https://www.acwing.com/problem/content/1320/

给定 N N N个石子,再给定一个正整数 K K K,两个玩家轮流取石子,可以取 1 ∼ K 1\sim K 1K之间的任意个数个石子,最后取完石子的人获胜。问先手是否有必胜策略。

输入格式:
输入仅一行,两个整数 N N N K K K

输出格式:
输出仅一行,一个整数,若先手获胜输出 1 1 1,后手获胜输出 2 2 2

数据范围:
1 ≤ N ≤ 1 0 5 1\le N\le 10^5 1N105
1 ≤ K ≤ N 1\le K\le N 1KN

这是最简单的巴什游戏(Bash Game),当 ( K + 1 ) ∤ N (K+1)\not|N (K+1)N时先手有必胜策略,他可以先拿 s s s石子使得 ( K + 1 ) ∣ ( N − s ) (K+1)|(N-s) (K+1)(Ns),这样的 s s s一定是存在且唯一的,接下来无论后手怎么做,先手必然又会面对 ( K + 1 ) ∤ N (K+1)\not|N (K+1)N的局面,他可以继续按上面的方法做。这样在最后一轮里,后手会面对 K + 1 K+1 K+1个石头这个局面,这个局面里后手无论怎么处理,先手都必胜。反之,如果 ( K + 1 ) ∣ N (K+1)|N (K+1)N,那么先手无论怎么处理,后手都将面对必胜局面,所以先手此时无必胜策略。代码如下:

#include <iostream>
using namespace std;

int main() {
    int n, k;
    cin >> n >> k;

    cout << (n % (k + 1) == 0 ? 2 : 1) << endl;
}

时空复杂度 O ( 1 ) O(1) O(1)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值