您的位置:首页 > 大数据 > 人工智能

[HDU1848]Fibonacci again and again

2017-08-14 09:42 316 查看

来源:

ACM Short Term Exam_2007/12/13

题目大意:

Nim游戏的一个变形,给定三堆棋子,每次只能从其中一堆取,取的个数为Fibonacci数列中的任意一项。
思路:

首先递推求出Fibonacci数列的前1000项,然后构造SG函数$sg[i]=mex\{sg[j]|j为i的后继状态\}$。
答案即为三者SG函数的异或。

#include<cstdio>
#include<cctype>
#include<cstring>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1001;
int f
={1,1},sg
;
bool hash
;
int main() {
for(int i=2;i<N;i++) f[i]=f[i-2]+f[i-1];
for(int i=1;i<N;i++) {
memset(hash,0,sizeof hash);
for(int j=1;f[j]<=i;j++) hash[sg[i-f[j]]]=true;
for(int j=0;j<N;j++) {
if(!hash[j]) {
sg[i]=j;
break;
}
}
}
for(int m=getint(),n=getint(),p=getint();m||n||p;m=getint(),n=getint(),p=getint()) {
puts(sg[m]^sg
^sg

?"Fibo":"Nacci"); } return 0; }

[p] 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: