【ACWing】1318. 取石子游戏

题目地址:

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

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

数据范围:
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)

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/114016239