CodeForces 15C Industrial Nim

本文解析了 CodeForces 平台上的题目 15C,介绍了博弈论中的Nim游戏及其变种,并给出了一个高效的算法解决方案。通过分析矿场中石头的分布情况,利用异或运算来确定先手玩家是否能够赢得游戏。

http://codeforces.com/problemset/problem/15/C

题意:有n个矿场,每个矿场输入x和m,表示有m辆车,第一辆有x块石头,第二辆有x+1块,依次类推第m辆有x+m-1块石头,两个人每次可以从任一辆车上取下任意数目的石头,最后不能取者败。

尼姆博弈的结论是,n个数异或起来为0则先手必败。此题数太多,有以下结论,1.从1到n异或运算,n%4==1时结果为1,n%4==2结果为n+1,n%4==3结果为0,n%4=0结果为n.

2.x到y异或,结果为Nim(y)^Nim(x-1)(Nim见代码。

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<set>
#define inf 10000000
#define pi acos(-1.0)
#define eps 1e-8
#define seed 131
#define min(a,b) a<b?a:b
#define max(a,b) a<b?b:a
typedef unsigned long long ULL;
typedef long long LL;
using namespace std;
int n;
LL x,m;
LL Nim(LL t)
{
    if(t%4==1)
        return 1;
    else if(t%4==2)
        return t+1;
    else if(t%4==3)
        return 0;
    else
        return t;
}
int main()
{
    cin>>n;
    LL ans=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&x,&m);
        LL u=Nim(x+m-1);
        LL v=Nim(x-1);
        ans^=u^v;
    }
    if(ans==0)
        printf("bolik\n");
    else
        printf("tolik\n");
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值