尼姆堆
【問題描述】
有3堆硬幣,分別是3,4,5
二人輪流取硬幣。
每人每次只能從某一堆上取任意數量。
不能棄權。
取到最後一枚硬幣的爲贏家.
求先取硬幣一方有無必勝的招法。
// 尼姆堆的模2加(異或)解法
/*
10
101
1100
1110
--------
0101
*/
#include<iostream>
using namespace std;
void f3(int* a,int len)
{
int sum = 0;
for (int i = 0; i<len; i++)
{
sum ^= a[i];
}
if (sum == 0)
{
printf("輸了\n");
return;
}
for (int i = 0; i<len; i++)
{
int x = sum ^ a[i];
if (x < a[i]) printf("%d --> %d\n", a[i], x);
}
}
int main()
{
int a[] = { 2, 5, 12, 14 };
f3(a,4);
}