HDU 1848 Fibonacci again and again(SG函数)
2018-06-17 21:12:22来源:未知 阅读 ()
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10069 Accepted Submission(s):
4289
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、 最先取光所有石子的人为胜者;
假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢。
m=n=p=0则表示输入结束。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int MAXN=1e4+10,INF=1e9+10; inline int read() { char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int fib[MAXN]; int S[MAXN],SG[MAXN]; int main() { #ifdef WIN32 freopen("a.in","r",stdin); #else #endif int N,M,P; N=20; fib[0]=1;fib[1]=1; for(int i=2;i<=20;i++) fib[i]=fib[i-1]+fib[i-2]; N=1001; for(int i=1;i<=N;i++) { memset(S,0,sizeof(S)); for(int j=1;j<=20&&fib[j]<=i;j++) S[ SG[ i-fib[j] ] ] = 1; for(int j=0;;j++) if(S[j]==0) {SG[i]=j;break;} } while(scanf("%d%d%d",&N,&M,&P)) { if(N==0&&M==0&&P==0) break; if(SG[N]^SG[M]^SG[P]) printf("Fibo\n"); else printf("Nacci\n"); } return 0;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:CSP201509-2:日期计算
- HDU-2955-Robberies(0-1背包) 2020-03-30
- hdu1455 拼木棍(经典dfs) 2020-02-29
- anniversary party_hdu1520 2020-02-16
- hdu1062 text reverse 2020-01-27
- hdu4841 2020-01-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash