D
简单博弈论问题。
这题是一个经典的博弈论问题,通常被称为Nim游戏。在这个游戏中,两名玩家轮流从一堆或多堆物品中取走一定数量的物品,每次取走的数量有一定的限制,最后取走所有物品的玩家获胜。
根据Nim游戏的经典结论,我们可以知道:
如果初始时棋子的数量n是(m+1)的倍数,那么无论先手如何操作,后手总有一种策略可以保持棋子的数量一直是(m+1)的倍数,直到先手不得不取走最后几颗棋子,留下(m+1)−k颗给后手(其中k是先手最后一次取走的棋子数,且1≤k≤m),然后后手可以一次性取走剩下的棋子获胜。
如果初始时棋子的数量n不是(m+1)的倍数,那么先手可以通过取走一定数量的棋子(设为x),使得剩下的棋子数量成为(m+1)的倍数(即n−x是(m+1)的倍数)。然后,先手就可以采用和上面后手相同的策略来确保自己获胜。
对于本题,因为只有一堆棋子,且后手玩家(阿鹏)在先手玩家(军军)每次操作后都可以调整剩下的棋子数量为(m+1)的倍数(如果初始时不是的话,且先手没有破坏这个状态),所以我们可以得出以下结论:
如果n是(m+1)的倍数,那么军军(先手)无法获胜,因为无论他怎么取,阿鹏(后手)都可以保持剩下的棋子数量为(m+1)的倍数,直到军军不得不取走最后一颗棋子前的某一次,留下(m+1)−k颗给阿鹏,然后阿鹏取走剩下的获胜。所以这种情况下阿鹏必胜。
如果n不是(m+1)的倍数,那么军军可以通过第一次取走一定数量的棋子(n mod (m+1)),使得剩下的棋子数量成为(m+1)的倍数。然后,军军就可以采用和后手相同的策略来确保自己获胜(但实际上在这个游戏中,一旦先手破坏了(m+1)倍数的状态,后手总是可以恢复它,所以先手几乎总是处于劣势,除非初始状态就是(m+1)的倍数)。但在这个特定的问题中,我们只需要知道先手是否有必胜策略,而不需要知道具体的必胜策略是什么。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n,m;
cin >>n>>m;
if(n%(m+1)!=0)
{
cout <<"Jun";
}
else cout <<"Peng";
}