zoukankan      html  css  js  c++  java
  • HDU 1848 Fibonacci again and again【SG函数】

    对于Nim博弈,任何奇异局势(a,b,c)都有a^b^c=0。

    延伸: 任何奇异局势(a1, a2,… an)都满足 a1^a2^…^an=0

    首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。

    例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。

    对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下:

          g(x)=mex{ g(y) | y是x的后继 }。

    SG函数性质:

    1,所有的终结点SG值为0(因为它的后继集合是空集)

    2,SG为0的顶点,它的所有后继y都满足SG不为0

    3,对于一个SG不为0的顶点,必定存在一个后继满足SG为0

    4,满足组合游戏性质:所有SG为0定点对应P点,SG大于0顶点对应N点

    SG定理(Sprague-Grundy Theorem):

       g(G)=g(G1)^g(G2)^…^g(Gn)。 游戏的和的SG函数值是它的所有子游戏的SG函数值的异或。

    #include<stdio.h>
    #include<string.h>
    const int N=1111;
    int p[N],sg[N],f[40];
    void init(){
        int i,j;
        f[1]=1,f[2]=2;
        for(i=3;;i++){
            f[i]=f[i-2]+f[i-1];
            if(f[i]>N)    break;
        }
        for(i=1;i<=1000;i++){
            for(j=1;f[j]<=i;j++){
                p[sg[i-f[j]]]=i;
            }
            for(j=0;j<=i;j++){
                if(p[j]!=i){
                    sg[i]=j;
                    break;
                }
            }
        }
    }
    int main(){
        init();
        int n,m,p;
        while(~scanf("%d%d%d",&n,&m,&p)){
            if(!n&&!m&&!p)    break;
            if(sg[n]^sg[m]^sg[p])    puts("Fibo");
            else                    puts("Nacci");
        }
        return 0;
    }
  • 相关阅读:
    31.迭代器丶生成器
    30.面向对象中常用内建函数与重载函数丶自定义手动报错
    安装补全命令的包
    安装yum
    centos7时间同步
    yum解决 "Couldn't resolve host 'apt.sw.be'" 错误
    centos6多实例安装mysql
    openstack--部暑
    kvm安装
    如何将本地大文件通过终端上传到linux服务器
  • 原文地址:https://www.cnblogs.com/L-King/p/5762641.html
Copyright © 2011-2022 走看看