题目地址
解题思路
使用巴什博弈就能做这道题。
先说一下巴什博弈是什么,两个玩家,共有m个物品,每个人每次最多取n个,最后正好取空的人获胜。
假设m = (n + 1),那无论当前这个人取多少,下一个人都必胜。所以对于m个物品可以写成
m = (n + 1) * r + s,那么只要第一个人先把多出来的s个取完,然后第二个人无论取多少,第一个人都给凑成n + 1个,第一个人一定是必胜的。
对于这个题,先判断一下n和m的关系。
如果n >= m,玩家一一定是必胜的,但价钱可以是从m到n之间的(有钱任性)。
如果n < m,那就凑成上面的形式,玩家一先取走多出来的s。如果s为0,那玩家一一定是必败的,输出none。
AC代码
#include <iostream>
using namespace std;
int main()
{
int n, m;
while (cin >> m >> n && (n + m))
{
if (n >= m)
{
int temp = 0;
for (int i=m; i<=n; i++)
{
if (temp)
cout << " ";
temp = 1;
cout << i;
}
cout << endl;
}
else if (m % (n + 1))
{
cout << m % (n + 1) << endl;
}
else
{
cout << "none" << endl;
}
}
return 0;
}