hdu 1848
这里贴出正解,和错误的解法(现在还不知道错在哪了)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 500;
int f[maxn];
int sg[maxn];
int m,n,p;
int getsg()
{
memset(sg,0,sizeof(sg));
int vis[1005];
for(int i = 1; i <= 1000; i ++){
memset(vis,0,sizeof(vis));
for(int j = 1; f[j] <= i; j ++){
vis[sg[i-f[j]]] = 1;
}
for(int j = 0; ;j ++){
if(!vis[j]){
sg[i] = j; break;
}
}
}
}
int main()
{
//freopen("DATA.c", "r", stdin);
//ios::sync_with_stdio(false);
f[1] = 1; f[2] = 2;
for(int i = 3; i <= 1005; i ++){
f[i] = f[i-1] + f[i-2];
}
memset(sg,-1,sizeof(sg));
getsg();
while(cin>>n>>m>>p){
if(!n && !m && !p) break;
int ans = sg[n] ^ sg[m] ^ sg[p];
if(ans) cout<<"Fibo"<<endl;
else cout<<"Nacci"<<endl;
}
return 0;
}
错误的解法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e4 + 500;
int f[maxn];
int sg[maxn];
int m,n,p;
int mex(int x)
{
if(sg[x] != -1) return sg[x];
bool vis[1005];
memset(vis,false,sizeof(vis));
for(int i = 1; f[i] <= x; i ++){
int tmp = x - f[i];
sg[tmp] = mex(tmp);
vis[tmp] = true;
}
for(int i = 0; ; i ++){
if(!vis[i]){
return sg[x] = i;
}
}
}
int main()
{
//freopen("DATA.c", "r", stdin);
//ios::sync_with_stdio(false);
f[1] = 1; f[2] = 2;
for(int i = 3; i <= 1005; i ++){
f[i] = f[i-1] + f[i-2];
}
memset(sg,-1,sizeof(sg));
while(cin>>n>>m>>p){
if(!n && !m && !p) break;
int ans = mex(n)^mex(m)^mex(p);
if(ans) cout<<"Fibo"<<endl;
else cout<<"Nacci"<<endl;
}
return 0;
}