nim取石子游戏, 有n堆石子,每堆有ai个石子,A和B轮流从非空的堆中取走至少一个石子。A先取,取光所有石子的一方获胜。当双方都采取最优策略时,谁能取胜?
1<=n<=100000
1<=ai<=10^9
a1 XOR a2 XOR……XOR an !=0 ->必胜态
a1 XOR a2XOR……XOR an==0 ->必败态
取走一个石子 必胜态就是必败态了。
必败态的二进制为1。从相应的石头堆取走相应的石子使它变成0 ,就成了必胜态。
#include<iostream>
#include <stdio.h>
#include<memory.h>
#define MAX 1000010
using namespace std;
int N,a[MAX];
int main()
{
int x=0;
for(int i=0;i<N;i++)x^=A[i];//^是亦或的符号
if(x!=0)printf("A\n");
else printf("B\n");
return 0;
}