您的位置:首页 > 其它

hdu 3032(博弈)

2015-11-11 20:35 295 查看
题意:

有两种操作可选:1.从一堆中拿任意多个(不为0)2.将其中任意一堆分为两堆。不能再操作者输。

sg[0] = 0;

sg[1] = 1;

n = 2, 可分为0, 1, (1, 1)sg[2] = 2;

以此类推,打表观察得 n % 4 == 1 || n % 4 == 2, sg
= n;

n % 4 == 0, sg
= n - 1;

n % 4 == 3, sg
= n + 1;

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#define LL long long
#define MAX 0x3f3f3f3f
#define N (1000000 + 5)

using namespace std;

int sg
, hash
;

// void init()
// {
//  memset(sg, 0, sizeof(sg));

//  sg[0] = 0;
//  sg[1] = 1;
//  sg[2] = 2;
//  sg[3] = 4;

//  for (int i = 4; i < N; i++)
//  {
//      memset(hash, 0, sizeof(hash));
//      for (int j = 0; j < i; j++)
//      {
//          hash[sg[j]] = 1;
//      }
//      for (int j = 1; j <= i / 2; j++)
//      {
//          int tmp = sg[j] ^ sg[i - j];
//          hash[tmp] = 1;
//      }
//      for (int j = 0; j < N; j++)
//      {
//          if (hash[j] == 0)
//          {
//              sg[i] = j;
//              break;
//          }
//      }
//  }

//  for (int i = 0; i <= 50; i++)
//  {
//      cout << i << ' ' << sg[i] << endl;
//  }
// }

int main()
{
int T;
scanf("%d", &T);

// init();

while (T--)
{
int n;
scanf("%d", &n);

int t, ans = 0;

for (int i = 1; i <= n; i++)
{
scanf("%d", &t);
if (t % 4 == 0)
{
ans = (ans ^ (t - 1));
}
else if (t % 4 == 3)
{
ans = (ans ^ (t + 1));
}
else
{
ans = (ans ^ t);
}
}

if (ans != 0)
{
cout << "Alice" << endl;
}
else
{
cout << "Bob" << endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu-3032 博弈