HDU3032 nim博弈

本文深入探讨了 Nim 博弈的基本概念及其解决策略,通过异或运算来判断胜负。详细分析了 Nim 数组中各堆的大小与 sg 值的关系,并提供了一个简化版的 C++ 实现代码,帮助读者理解如何利用数学原理解决 Nim 类问题。

题目大意:

可以从某一堆中取任意个数,也可把一堆分成两个不为0的堆,直到某一方无法操作为输

 

因为是nim博弈,所以只要考虑一堆时候的sg值,把所有堆的sg值异或即可

很显然这里 0 是一个终止态 sg[0]=0;

sg[1]=1 ;

2 的时候可分为 0 , 1 , (1,1) 3种情况,sg值分别为 0,1,0,所以sg[2]=2

3的时候可分为0,1,2,(1,2),sg值分别为0,1,2,3,所以sg[3]=4

而4的时候sg[4]=3

多试验可得sg(4k)=4k-1;sg(4k+1)=4k+1;sg(4k+2)=4k+2;sg(4k+3)=4k+4;

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8   //  freopen("a.in" , "r" , stdin);
 9     int T;
10     scanf("%d" , &T);
11     while(T--)
12     {
13         int n,a;
14         int ans=0;
15         scanf("%d" , &n);
16         for(int i=0 ; i<n ; i++){
17             scanf("%d",&a);
18             if(a%4==0) ans^=(a-1);
19             else if(a%4==3) ans^=(a+1);
20             else ans^=a;
21         }
22         if(ans) printf("Alice\n");
23         else printf("Bob\n");
24     }
25     return 0;
26 }

 

转载于:https://www.cnblogs.com/CSU3901130321/p/4256276.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值