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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

51nod 1661 黑板上的游戏(yjq魔改ver【x【博弈,稍微数学推一下

题意差不多就是那样……但是输出的方案(题面原话)是→“我们需要使得擦去的数字下标尽量大, 在此前提下, 我们希望写上的数字尽量大” 总之我胡搞乱搞只有52分,嗨呀好气啊,std是yjq的代码……yjq...
  • Flaze_
  • Flaze_
  • 2016年09月10日 23:57
  • 322

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

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

51Nod Problem 1067 Bash游戏 V2(博弈,sg函数)

51Nod Problem 1067 Bash游戏 V2(博弈,sg函数)

51Nod Problem 1068 Bash游戏 V3(博弈,sg函数)

51Nod Problem 1068 Bash游戏 V3(博弈,sg函数)

HDU 5795 A Simple Nim (找规律+sg函数+博弈)

题目链接:HDU 5795 题面: A Simple Nim Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65...

【博弈+SG函数+打表找规律】HDU_5795_A Simple Nim

Two players take turns picking candies from n heaps,the player who picks the last one will win the g...

hdu 1079 Calendar Game(博弈SG函数 || 奇偶找规律)

题意: 从当前日期,在他/她转的玩家可以移动到下一个历日或下月的同一天。当在之后的一个月中没有在同一天,播放器只能移动到下一个的日历日期。例如,从1924年12月19日,你可以移动到1924年12月...
  • LiWen_7
  • LiWen_7
  • 2012年09月05日 21:56
  • 2237

codefoeces 603C (博弈 SG函数找规律)

C. Lieges of Legendre time limit per test 2 seconds memory limit per test 256 megabytes ...

hdu 1079 Calendar Game (SG函数)(博弈——找规律)

Calendar Game题意: 从当前日期,在他/她转的玩家可以移动到下一个历日或下月的同一天。当在之后的一个月中没有在同一天,播放器只能移动到下一个的日历日期。例如,从1924年12月19日,你...

Hdu2177-博弈(Sg函数找规律)

收获:一开始wa了,然后进行调试时,调试到某个位置,查看d数组时,codeblock就卡死了,运行程序也关不掉,任务管理器也不起作用,然后都比的注销了两次电脑,最后发现,原来数组有一个数组越界了,并且...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51nod 1661 黑板上的游戏(博弈sg函数找规律)
举报原因:
原因补充:

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