【bzoj 1115】石子游戏Kam(阶梯Nim游戏)

传送门biu~
阶梯Nim游戏大意:每个阶梯上有一堆石子,两个人在阶梯上玩推石子游戏。每人可以将某堆的任意多石子向左推一阶,所有的石子都推到阶梯下了即算成功。
阶梯Nim游戏
如果只考虑对偶数堆的操作,如果对方将偶数堆的石子推向了奇数堆,那么我们就可以把这些石子再往左推推向更左边的偶数堆——这样一个回合,奇数堆中的状态并没有改变,玩家的顺序也并没有改变,但是偶数堆却慢慢地向阶梯下移。也就是说对偶数堆操作的情况我们不用考虑;只考虑对奇数堆操作,玩家将奇数堆中的石子推到偶数堆,可以看做是从奇数堆中取走了若干石子,即可以用SG函数来判断胜负。
而对于此题,保证“每堆石子个数都不少于前一堆的石子个数”,我们可以构建一个“反阶梯Nim游戏”,阶梯上每堆石子的数量是原题中两堆石子的数量差。原题中,取走一个堆中的石子,下一个堆中的石子数目与这个堆中的石子数目差一定会增大——也就是说在“反阶梯Nim游戏”中相当于把一个阶梯上的石子推向右边的下一个阶梯,运行原理与阶梯Nim游戏相同。注意奇偶堆的判断要从n开始。

#include<bits/stdc++.h>
using namespace std;
int a[10005];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int ans=0,n;
        scanf("%d",&n);
        for(int i=1;i<=n;++i)   scanf("%d",&a[i]);
        for(int i=n;i>1;i-=2)   ans^=(a[i]-a[i-1]);
        if(n&1) ans^=a[1];
        printf(ans ? "TAK\n" : "NIE\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zP1nG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值