题目地址:
https://www.acwing.com/problem/content/1320/
给定 N N N个石子,再给定一个正整数 K K K,两个玩家轮流取石子,可以取 1 ∼ K 1\sim K 1∼K之间的任意个数个石子,最后取完石子的人获胜。问先手是否有必胜策略。
输入格式:
输入仅一行,两个整数
N
N
N和
K
K
K。
输出格式:
输出仅一行,一个整数,若先手获胜输出
1
1
1,后手获胜输出
2
2
2。
数据范围:
1
≤
N
≤
1
0
5
1\le N\le 10^5
1≤N≤105
1
≤
K
≤
N
1\le K\le N
1≤K≤N
这是最简单的巴什游戏(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)∣(N−s),这样的 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)。