码迷,mamicode.com
首页 > 其他好文 > 详细

HDU_1848 Fibonacci again and again

时间:2017-10-28 20:29:48      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:函数   就是   with   def   思路   题目   ret   set   fine   

1.题目:

  任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:
  F(1)=1;
  F(2)=2;
  F(n)=F(n-1)+F(n-2)(n>=3);
  所以,1,2,3,5,8,13……就是菲波那契数列。
  在HDOJ上有不少相关的题目,比如1005 Fibonacci again就是曾经的浙江省赛题。
  今天,又一个关于Fibonacci的题目出现了,它是一个小游戏,定义如下:
  1、  这是一个二人游戏;
  2、  一共有3堆石子,数量分别是m, n, p个;
  3、  两人轮流走;
  4、  每走一步可以选择任意一堆石子,然后取走f个;
  5、  f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8…等数量);
  6、  最先取光所有石子的人为胜者;

  假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢。

2.思路

  直接套SG函数。。。。

3.代码

 

#include <bits/stdc++.h>
#define max3(a,b,c) max(max((a),(b)),(c))
using namespace std;
bool ins[1005];
int sg[1005];
void getSG(int n){
	for(int i=1;i<=n;i++){
		int a=1,b=2;
		memset(ins,0,sizeof(ins));
		while(i>=a){
			int tem=a;
			ins[sg[i-a]]=true;
			a=b;
			b+=tem;
		}
		for(int j=0;;j++)
			if(!ins[j]){
				sg[i]=j;
				break;
			}
	}
}
int main(){
	ios::sync_with_stdio(false);
	while(1){
		int a,b,c;
		cin>>a>>b>>c;
		if(!(a||b||c))
			break;
		getSG(max3(a,b,c));
		if(sg[a]^sg[b]^sg[c])
			cout<<"Fibo"<<endl;
		else
			cout<<"Nacci"<<endl;
	}
	return 0;
}

 

HDU_1848 Fibonacci again and again

标签:函数   就是   with   def   思路   题目   ret   set   fine   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7747837.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!