51nod 1661 黑板上的游戏(博弈sg函数找规律)

原创 2016年08月29日 13:39:02

1661 黑板上的游戏
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注
Alice和Bob在黑板上玩一个游戏,黑板上写了n个正整数a1, a2, …, an,游戏的规则是这样的:
1. Alice占有先手主动权。
2. 每个人可以选取一个大于1的数字擦去,并写上一个更小的数字,数字必须是整数,然后由对方进行下一次操作。
3. 如果擦去的数字是 x (x > 1) ,则写上的数字不能比 x/k 小,但是要比 x 小。这里的除法为有理数除法。
4. 不可以擦去任何一个数字 1 ,如果当前无法找到一个数字进行操作,则当前方输。
假设Alice和Bob都会选择最优的策略,请问Alice是否存在必胜的方案?
Input
第一行两个空格隔开的正整数n和k,其中n表示数字的个数,k表示游戏的参数。
第二行n个空格隔开的正整数,其中第i个表示ai。
1 ≤ n ≤ 10^5, 2 ≤ k ≤ 10^18, 1 ≤ ai ≤ 10^18。
Output
如果存在必胜方案,则输出“Alice i y”,其中i和y表示先手的一种能必胜的操作:将第i个数修改为y。
如果没有,则输出“Bob”表示后手必胜。
(输出不含引号)
Input示例
4 2
2 3 3 3
Output示例
Alice 2 2



sg
sg

sg[i],sg[i]ans
sgsg
k1
a1a1k=sg

sg


代码

#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")

using namespace std;
#define   MAX           100005
#define   MAXN          1000005
#define   maxnode       205
#define   sigma_size    2
#define   lson          l,m,rt<<1
#define   rson          m+1,r,rt<<1|1
#define   lrt           rt<<1
#define   rrt           rt<<1|1
#define   middle        int m=(r+l)>>1
#define   LL            long long
#define   ull           unsigned long long
#define   mem(x,v)      memset(x,v,sizeof(x))
#define   lowbit(x)     (x&-x)
#define   pii           pair<int,int>
#define   bits(a)       __builtin_popcount(a)
#define   mk            make_pair
#define   limit         10000

//const int    prime = 999983;
const int    INF   = 0x3f3f3f3f;
const LL     INFF  = 0x3f3f;
//const double pi    = acos(-1.0);
const double inf   = 1e18;
//const double eps   = 1e-9;
const LL     mod   = 1e9+7;
const ull    mx    = 133333331;

/*****************************************************/
inline void RI(int &x) {
      char c;
      while((c=getchar())<'0' || c>'9');
      x=c-'0';
      while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';
 }
/*****************************************************/

LL x[MAX];
LL b[MAX];
LL k;
LL sg(LL a){
    if(a==1) return 0;
    if((a-1)%k==0) return sg((a-1)/k);
    else{
        int tmp=0;
        if(a%k!=0) tmp++;
        return a-a/k-tmp;
    }
}

LL find(LL a,LL y,LL c){
    if(a>=y&&a<c) return a;
    if((c-1)/k<a) return c;
    return find(a*k+1,y,c);
}

LL solve(LL a){
    LL l=1,r=1e18;
    while(l<=r){
        LL mid=(l+r)/2;
        LL tmp=mid-1-(mid-1)/k;
        if(tmp>=a) r=mid-1;
        else l=mid+1;
    }
    return l;
}
int main(){
    //freopen("in.txt","r",stdin);
    int n;
    cin>>n>>k;
    LL ans=0;
    for(int i=1;i<=n;i++){
        scanf("%I64d",&x[i]);
        b[i]=sg(x[i]);
        ans^=b[i];
    }
    if(ans){
        printf("Alice");
        for(int i=1;i<=n;i++){
            if(x[i]==1) continue;
            LL tmp=ans^b[i];
            tmp=solve(tmp);
            tmp=find(tmp,x[i]/k+((x[i]%k==0)?0:1),x[i]);
            if(tmp<x[i]){
                printf(" %d %I64d\n",i,tmp);
                break;
            }
        }
    }
    else printf("Bob\n");
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

博弈论 SG函数

别被文章长度吓到,学会博弈(SG)只用看前1/10。 鉴于讲明白博弈要写好多字,于是找了些论文拼凑,对疑难点加了注释并配上“美图”助解。 Nim游戏 重点结论:对于一个Nim游戏的局面(a1,a2,....
  • strangedbly
  • strangedbly
  • 2016年04月12日 21:36
  • 7611

博弈sg函数

sg函数(个人认为还是用于三种方法都无法解决的情况,如按特殊数字取石子) 我们把整个博弈过程抽象为有向无环图 1.      几项准备工作: mex求最小非负整数mex{} = 0,mex{0,1,2...
  • qq_30241305
  • qq_30241305
  • 2016年03月07日 15:36
  • 1167

博弈论 Nim游戏与SG函数

SG函数&Nim游戏
  • neighthorn
  • neighthorn
  • 2016年07月09日 21:41
  • 655

51nod - 1661 黑板上的游戏 - 博弈论

题目:51nod 算法马拉松 17(告别奥运)A 黑板的游戏 题意:两个人轮流玩擦数字游戏,给定n个数ai(i=1,2,3,...,n)和一个k,(1≤n≤105,2≤k≤1018,1≤ai≤101...
  • qq_23323877
  • qq_23323877
  • 2016年08月31日 15:05
  • 288

博弈 SG函数

为什么要学习这个呢?因为每次看到题解的第一句话总是这种的: 水题,简单题,模板题,打表题 然后,第二句话,就是结论,比如sg【x】等于(然后一个分类),就得到了公式 最后就是把所有的亦或起来,就得到了...
  • kevin66654
  • kevin66654
  • 2016年08月10日 17:11
  • 394

博弈论 SG函数从懵逼到入门 SG模板 hdu1848

 摘自piaocoder的博客: 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如 mex{0,1,2,4...
  • yizhangbiao
  • yizhangbiao
  • 2016年07月22日 10:03
  • 1404

博弈之SG函数(详解为什么异或可以得出结果)

给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负。事实上,这个游戏可以认为是所有Impartial Combinatorial Games的...
  • hndu__lz
  • hndu__lz
  • 2017年03月13日 20:40
  • 528

博弈论 来来来 套路一波(ACM中SG函数应用)

简单的NIM游戏解决策略硬币游戏 Alice和Bob正在玩这样一个游戏,给定k个数字a1,a2,…,ak。一开始有n堆硬币,每堆硬币各有xi枚硬币。Alice和Bob轮流选出一堆硬币,从中取出一些...
  • baidu_33153085
  • baidu_33153085
  • 2016年08月05日 12:40
  • 674

51NOD 1661 黑板上的游戏(博弈 找规律)——算法马拉松17(告别奥运)

传送门1661 黑板上的游戏Alice和Bob在黑板上玩一个游戏,黑板上写了n个正整数a1, a2, …, an,游戏的规则是这样的:1 . Alice占有先手主动权。2 . 每个人可以选取一个大于1...
  • qingshui23
  • qingshui23
  • 2016年08月29日 12:58
  • 958

组合游戏 - SG函数和SG定理

组合游戏的和通常是很复杂的,所以我们介绍一种新工具,可以使组合问题变得简单————SG函数和SG定理。 Sprague-Grundy定理(SG定理):         游戏和的SG函数等于各个游戏SG...
  • luomingjun12315
  • luomingjun12315
  • 2015年05月07日 08:09
  • 8169
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51nod 1661 黑板上的游戏(博弈sg函数找规律)
举报原因:
原因补充:

(最多只允许输入30个字)