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