1. 程式人生 > >SG打表——Fibonacci again and again HDU

SG打表——Fibonacci again and again HDU

這裡寫圖片描述 這裡寫圖片描述

題解:SG打表 從1到n列出一堆石子所有可能的情況,在搜尋小於這個i的所有斐波那契數,標記當前 i 減去斐波那契數產生子局面 的SG值,之後得到當前n的SG值

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long int
using namespace std;
int m,n,p;
int f[1005],sg[1005],ha[1005];

void F()
{
    f[1] = 1;
    f[2] = 1;
    for(int i = 3 ; f[i-1
]<=1000 ; i++) { f[i] = f[i-1]+f[i-2]; } } void SG(int n) { memset(sg,0,sizeof(sg)); for(int i = 1; i <=n ; i++) { memset(ha,0,sizeof(ha)); for(int j = 1 ; f[j]<=i ; j++) ha[sg[i-f[j]]] =1; for(int j = 0 ; j <= n ; j++) { if
(ha[j]==0) { sg[i] = j; break; } } } } int main() { F(); SG(1000); while(cin>>n>>m>>p&&n+m+p!=0) { int sum = 0; sum^=sg[n]^sg[m]^sg[p]; if(sum != 0) cout<<"Fibo"
<<endl; else cout<<"Nacci"<<endl; } return 0; }