标签:函数 就是 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