HDU ~ 1848 ~ Fibonacci again and again (SG函数模板题)

思路:先算出1000以为内的Fibonacci数,其实也就是前15个。然后求SG值,异或起来就是答案。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 1e3 + 5;
//f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理
//SG[]:0~n的SG函数值
//S[]:为x后继状态的集合
int F[MAXN], SG[MAXN], S[MAXN];
void FiboNacci(int f0, int f1, int n)
{
    F[0] = f0; F[1] = f1;
    for (int i = 2; i <= n; i++) F[i] = F[i-1] + F[i-2];
}
void get_SG(int n, int N)
{
    memset(SG, 0, sizeof(SG));//因为SG[0]始终等于0,所以i从1开始
    for(int i = 1; i < n; i++)
    {
        memset(S, 0, sizeof(S));//每一次都要将上一状态 的 后继集合 重置

        for(int j = 0; F[j] <= i && j < N; j++)
            S[SG[i-F[j]]] = 1;  //将后继状态的SG函数值进行标记

        for(int j = 0; ; j++)  //查询当前后继状态SG值中最小的非零值
            if(!S[j]) { SG[i] = j; break; }
    }
}
int main()
{
    FiboNacci(1, 1, 16);
    get_SG(MAXN, 16);
    int m, n, p;
    while (cin >> m >> n >> p && (m + n + p))
    {
        if (SG[m]^SG[n]^SG[p]) printf("Fibo\n");
        else printf("Nacci\n");
    }
    return 0;
}
/*
1 1 1
1 4 1
0 0 0
*/
/*
Fibo
Nacci
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值