石子 最多拿 K
title: 题目
有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。
例如$N = 3,K = 2$。无论A如何拿,B都可以拿到最后1颗石子。
第1行:一个数T,表示后面用作输入测试的数的数量。$(1 <= T <= 10000)$
第$2 - T + 1$行:每行2个数$N,K$。中间用空格分隔。$(1 <= N,K <= 10^9)$
title: input
4
3 2
4 2
7 3
8 3
title: output
B
A
A
B
title: 思路
可以把石子分成 m 堆, 每堆 k 个, 最后可能会有一堆 <= k 的。
若存在 一堆<=k, 则先手可以取走 这一堆, 剩下的全是 m堆里 每堆数量都是k个, 转化为Nim游戏, 此时第一个取的人必败。
但有个要求, 剩下的堆数不能为1, 否则后手一定胜利。
这里把每堆分为 k+1 个石子, 这样就符合要求。
故若 n % (k + 1) > 0时,先手必赢。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,k;
int main()
{
cin >> n >> k;
if(n % (k + 1)) cout << 1 << endl;
else cout << 2 << endl;
return 0;
}