(step8.2.6)hdu 1848(Fibonacci again and again——组合博弈)

题目大意:输入3个整数m,n,p,分别表示3堆石头中的石头个数


解题思路:

1)斐波那契数列的第16个数fib[16] == 1597

2)(sg[m]^sg[n]^sg[p])   。一定要加括号,否则会WA


代码如下:

 

/*

 * 1848_1.cpp

 *

 *  Created on: 2013年9月1日

 *      Author: Administrator

 */



#include <iostream>





using namespace std;



const int maxn = 1001;

int sg[maxn];

int f[maxn];

int hash[maxn];



void getSG(int n){



	int i,j;

	memset(sg,0,sizeof(sg));

	for(i = 1 ; i<= n ; ++i){

		memset(hash,0,sizeof(hash));

		for(j = 1 ; f[j] <= i ; ++j ){

			hash[sg[i-f[j]]] = 1;

		}



		for(j = 0 ; j <= n ; ++j){

			if(hash[j] == 0){

				sg[i] = j;

				break;

			}

		}

	}

}



int main(){

	int m,n,p;



	f[0] = 1;

	f[1] = 1;

	int i ;

	for(i = 2 ; i <= 16 ; ++i){//这里之所以取16是因为fib[16] 已经是 1597,已经大于n的最大值

		f[i] = f[i - 1] + f[i - 2];

	}

	getSG(1000);

	while(scanf("%d%d%d",&m,&n,&p)!=EOF,m||n||p){

		if((sg[m]^sg[n]^sg[p]) == 0){//sg[m]^sg[n]^sg[p]外面别忘了加括号(),否则会WA

			printf("Nacci\n");

		}else{

			printf("Fibo\n");

		}

	}

}




 



 

你可能感兴趣的:(fibonacci)