hdu 3389 Game 阶梯博弈

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL __int64
const int maxn=1010;
int main()
{
    int T,tt=0;
    cin>>T;
    while(T--)
    {
        int i,j,k,n,ans=0,a;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>a;
            if(i%6==0||i%6==2||i%6==5)ans^=a;
        }
        cout<<"Case "<<++tt<<": ";
        if(ans)cout<<"Alice"<<endl;
        else cout<<"Bob"<<endl;
    }
    return 0;
}
/*
    阶梯博弈,SG定理
    以下取余是对6取余。
    由题意可知,可分三个子游戏:
    1.余0的箱子中的卡只能移到余3里,余3的箱子只能移到余0里。最终箱子编号为3;
    2.余2的箱子中的卡只能移到余1里,余1的箱子只能移到余2里。最终箱子编号为1;
    3.余4的箱子中的卡只能移到余5里,余5的箱子只能移到余4里。最终箱子编号为4;
    
    对于1子游戏,若一个人从余3移一定数目的卡到余0的a箱里,那另一个也必定可以从a箱中移出相同数目的卡。所以
我们只用考虑从余0中移出的情况(因为余0中移到3号箱中,另一个就不能从3号箱子移出卡,不能与上述判断等同),
而从余0中移到余3中可以看做从余0中删除,因为余数3的可以根据上述方式最终移动3中,而先后手顺序不变。
这就变成了取石子游戏了,sg[i]=i。
    其余的2,3同理。最终求得的sg函数值,异或下酒是结果了
*/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值