51nod_1714:B君的游戏(博弈 sg打表)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1714

nim游戏的一个变形,需要打出sg函数的表

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int maxn=70000000;
int sg[65], maxs;
int vis[maxn];

//yu控制递归层数,cur控制所分配最大值,next控制所分配最小值
void dfs(int cur, int yu, int ans, int next)
{
    if(yu==0)
    {
        vis[ans]=1;
        return ;
    }
    for(int i=next; i<cur; i++)
        dfs(cur, yu-1, ans^sg[i], i);
}
void init()
{
    sg[0]=0;
    for(int i=1;i<=64; i++)
    {
        memset(vis,0,sizeof(vis));
        dfs(i, 7, 0, 0);
        for(int j=0;;j++)
            if(!vis[j])
            {
                sg[i]=j;
                break;
            }
        printf("%d\n", sg[i]);
    }
}
void print(int n)
{
    for(int i=31;i>=0;i--)
    {
        if((n>>i)&1) cout<<1;
        else cout<<0;
    }
    cout<<endl;
}

int main()
{
    init();
    for(int i=0;i<65;i++)
        print(sg[i]);
}
//Process exited after 232.7 seconds with return value 0 
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long uLL;

int sg[] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 255, 256, 512,
            1024, 2048, 3855, 4096, 8192, 13107, 16384, 21845,
            27306, 32768, 38506, 65536, 71576, 92115, 101470,
            131072, 138406, 172589, 240014, 262144, 272069,
            380556, 524288, 536169, 679601, 847140, 1048576,
            1072054, 1258879, 1397519, 2005450, 2097152, 2121415,
            2496892, 2738813, 3993667, 4194304, 4241896, 4617503,
            5821704, 7559873, 8388608, 8439273, 8861366, 11119275,
            11973252, 13280789, 16777216, 16844349, 17102035,
            19984054, 21979742, 23734709
           };

int cal(uLL x)
{
    int ret=0;
    for(int i=0;i<64;i++)
        if((x>>i)&1) ret++;
    return ret;
}
int main()
{
    int n;
    while(cin>>n)
    {
        int ans=0;
        while(n--)
        {
            uLL t;
            cin>>t;
            ans ^= sg[cal(t)];
        }
        if(ans) puts("B");
        else puts("L");
    }
}
时间: 2024-12-27 23:53:07

51nod_1714:B君的游戏(博弈 sg打表)的相关文章

51NOD 算法马拉松15(脱欧专场) B君的游戏(博弈)

传送门 B君的游戏 wwwwodddd (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 B君和L君要玩一个游戏.刚开始有n个正整数 ai . 双方轮流操作.每次操作,选一个正整数x,将其移除,再添加7个数字 x1,x2-x7 .要求对于 xi ,满足 0<= xi < x 且 x&xi=xi 注意0不能被选取,所以这个游戏一定会结束,而谁无法操作谁就失败. B君根据自己的经验,认为先手胜率高一点,所以B君是先手. B君想知道自己是否必胜. Input 第一

石油大训练 Little Sub and Johann (博弈SG打表找规律)

Little Sub and Johann 题目描述 Little Sub and Johann are good friends and they often play games together. Recently, they like playing with stones.They have n piles of stones initially and they should make one of following movements by turns:1.Erase a pil

HDU 3032 Nim or not Nim?(博弈 SG打表找规律)

传送门 Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1457    Accepted Submission(s): 720 Problem Description Nim is a two-player mathematic game of strategy in which players take

Nim 游戏、SG 函数、游戏的和

Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于"Impartial Combinatorial Games"(以下简称ICG).满足以下条件的游戏是ICG(可能不太严谨):1.有两名选手:2.两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动:3.对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作.以前的任何操作.骰子的点数

UVA 10561 - Treblecross(博弈SG函数)

UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',可以在'.'的位置放X,谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每个串要是上面有一个X,周围的4个位置就是禁区了(放下去必败),所以可以以X分为几个子游戏去求SG函数的异或和进行判断,至于求策略,就是枚举每个位置就可以了 代码: #include <stdio.h> #include <string.h> #include <algorithm> usi

(博弈 sg入门2)

接下来介绍Nim游戏(同样引用杭电上的,懒的打字) 1.有两个玩家:   2.  有三堆扑克牌(比如:可以分别是    5,7,9张):  3. 游戏双方轮流操作:  4. 玩家的每次操作是选择其中某一堆牌,然后从中取走任意张:   5.最后一次取牌的一方为获胜方: 想一会: 还记得刚才说的P点和N点吗?P:必败点,N:必胜点 先给出结论,这里要用到位运算,异或:^ 游戏的某个位置(x1,x2,x3) x1,x2,x3表示3堆的个数.当且仅当 x1^x2^x3=0时,此点才是必败点P: 结论可以

UVA 11534 - Say Goodbye to Tic-Tac-Toe(博弈sg函数)

UVA 11534 - Say Goodbye to Tic-Tac-Toe 题目链接 题意:给定一个序列,轮流放XO,要求不能有连续的XX或OO,最后一个放的人赢,问谁赢 思路:sg函数,每一段...看成一个子游戏,利用记忆化求sg值,记忆化的状态要记录下左边和右边是X还是O即可 代码: #include <stdio.h> #include <string.h> const int N = 105; int t, sg[3][3][N]; char str[N]; int ge

【HDU3032】【Lasker&#39;s Nim(一种Nim游戏)】Nim or not Nim? Multi-SG博弈、打表

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42652745 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:n堆石子,每次可以从某堆中拿走若干,也可以把此堆分成两个非空堆,谁无法操作了谁输. 题解:首先我们可以打个SG函数来暴力出解,但是显然这会T. 但是不要害怕,我们打完以后发现了一个貌似对的规律: 对于所有的k >= 0,有 sg( 4k+1 ) = 4k+1: sg( 4k+2 ) = 4k+2: sg(

(转)博弈 SG函数

此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------------------------------------------------------------------- 1.定义P-position和N-positon P表示Previous,N表示Next. 即上一个移动的人有必胜策略的局面是P-position,"先手必败"或&qu