UVA 1378 A Funny Stone Game (经典博弈)

题目传送门


代码不是关键,关键的是对博弈和sg函数的理解。重点是在构造sg函数的时候是将一个石头看成一个堆,所以按照sg函数的定义后继状态为两个石头构成的堆。然后根据对称性原理和xor的性质,在某个堆,只有石头个数为奇数时才会对参与xor,才会对最后答案有贡献。

最后枚举第一步操作的可能性使得xor为0即转入必败态。此时相当于去掉第i个堆里的一个石头,在第j堆和第k堆加上个一块石头。

#include 
using namespace std;

const int N=100005;
int vis[80],sg[30],num[30];
int init()
{
    sg[1]=0;
    for(int i=2;i<=23;i++)
    {
        memset(vis,0,sizeof(vis));
        for(int j=1;j


你可能感兴趣的:(博弈)