• [BZOJ 3576][Hnoi2014]江南乐(博弈论)


    Description

    小A是一个名副其实的狂热的回合制游戏玩家。在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏。    游戏的规则是这样的,首先给定一个数F,然后游戏系统会产生T组游戏。每一组游戏包含N堆石子,小A和他的对手轮流操作。每次操作时,操作者先选定一个不小于2的正整数M (M是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于F的石子分成M堆,并且满足这M堆石子中石子数最多的一堆至多比石子数最少的一堆多1(即分的尽量平均,事实上按照这样的分石子万法,选定M和一堆石子后,它分出来的状态是固定的)。当一个玩家不能操作的时候,也就是当每一堆石子的数量都严格小于F时,他就输掉。(补充:先手从N堆石子中选择一堆数量不小于F的石子分成M堆后,此时共有N+M-1)堆石子,接下来小A从这N+M-1堆石子中选择一堆数量不小于F的石子,依此类推。

    小A从小就是个有风度的男生,他邀请他的对手作为先手。小A现在想要知道,面对给定的一组游戏,而且他的对手也和他一样聪明绝顶的话,究竟谁能够获得胜利?

    Solution

    每堆石子都是一个子游戏,所以说求异或和就好了

    每次暴力枚举分成几堆好像有70分

    然而发现当n/i==n/(i+2)时异或的结果相同

    当n/j==n/i时结果最多只有两种

    所以就优化到了n*sqrt(n)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #define MAXN 100007
    using namespace std;
    int T,f,n,sg[MAXN],vis[MAXN];
    bool done[MAXN];
    int get(int x,int y)
    {return ((x&1)==0)?0:y;}//位运算优先级超级低!加括号!!
    int work(int x)
    {
        if(x<f)return 0;
        if(done[x])return sg[x];//一定要用done数组,直接判断有没有sg[]的值特定情况会死循环 
        done[x]=1;int last;
        for(int i=2;i<=x;i=last+1)
        {
            last=x/(x/i);
            for(int j=i;j<=i+1&&j<=min(x,last);j++)
            work(x/j),work(x/j+1);
        }
        for(int i=2;i<=x;i=last+1)
        {
            last=x/(x/i);
            for(int j=i;j<=i+1&&j<=x;j++)
            {
                int k2=x%j,k1=j-k2;
                vis[get(k1,sg[x/j])^get(k2,sg[x/j+1])]=x;
            }
        }
        int i=0;
        while(vis[i]==x)i++;
        return sg[x]=i;
    }
    int main()
    {
        scanf("%d%d",&T,&f);
        while(T--)
        {
            scanf("%d",&n);
            
            int ans=0;
            for(int i=1;i<=n;i++)
            {
                int x;
                scanf("%d",&x);
                ans^=work(x);
            }
            printf("%d",ans?1:0);
            if(T)putchar(' ');
        }
        return 0;
    } 
  • 相关阅读:
    语音识别六十年
    神经网络架构PYTORCH-几个概念
    Ubuntu 16.04 系统无法挂载u盘的问题
    技术的止境
    神经网络架构PYTORCH-宏观分析
    Python中parameters与argument区别
    神经网络架构PYTORCH-初相识(3W)
    【ES】学习9-聚合2
    【ES】学习8-聚合1
    【python】中文提取,判断,分词
  • 原文地址:https://www.cnblogs.com/Zars19/p/6863301.html
Copyright © 2020-2023  润新知