zoukankan      html  css  js  c++  java
  • HDU1848_Fibonacci again and again_经典的求sg

    /*
    *State: 1848    0MS    320K    994 B    C++
    *题目大意:
    *        给定3堆棋子,每次可以从每一堆中拿斐波那契个棋子,最后
    *        先取完者胜,判断该局是否为奇异局势(P或N点);
    *解题思路:
    *        典型的求sg函数即可求解。
    */
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    const int MAX = 1024;
    int sg[MAX];
    
    void pre_init()
    {
        int fib[1024];
        fib[0] = fib[1] = 1;
        for(int i = 2; i < 1024; i++)
        {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        bool vis[MAX] = {false};
        for(int i = 0; i < MAX; i++)
        {
            int h = 1;
            memset(vis, false, sizeof(vis));
            while(i >= fib[h])
            {
                int tmp = i - fib[h++];
                vis[sg[tmp]] = true;
            }
            int j;
            for(j = 0; j <= i; j++)
            {
                if(vis[j] == false)
                    break;
            }
            sg[i] = j;
        }
        return ;
    }
    
    void view_arr(int arr[], int n)
    {
        for(int i = 0; i < n; i++)
            cout << arr[i] << endl;
        return ;
    }
    
    int main(void)
    {
        pre_init();
        //view_arr(sg, 20);
        int a[3];
        while(scanf("%d %d %d", &a[0], &a[1], &a[2]) == 3)
        {
            if(!(a[0] || a[1] || a[2]))
                break;
            int yihuo = 0;
            for(int i = 0; i < 3; i++)
            {
                yihuo ^= sg[a[i]];
            }
            if(!yihuo)
                printf("Nacci\n");
            else
                printf("Fibo\n");
        }
        return 0;
    }
  • 相关阅读:
    PyQt5 -1 最基本的小窗口
    浅谈线段树
    最小生成树问题
    最短路问题
    多重背包问题
    02背包(嘻嘻,完全背包)
    01背包例题
    背包问题(好奇怪)
    关于深搜及广搜
    搜索回溯(第二)
  • 原文地址:https://www.cnblogs.com/cchun/p/2610290.html
Copyright © 2011-2022 走看看