您的位置:首页 > 其它

hdu 1848 sg博弈模版题

2013-04-16 00:50 381 查看
/*
计算从1-n范围内的SG值。
Array(存储可以走的步数,Array[0]表示可以有多少种走法)
Array[]需要从小到大排序

1.可选步数为1-m的连续整数,直接取模即可,SG(x) = x % (m+1);
2.可选步数为任意步,SG(x) = x;
3.可选步数为一系列不连续的数,用GetSG(计算)
*/

int SG[MAX], hash[MAX];
void GetSG(int Array[], int n = MAX-1)
{
int i, j;
memset(SG, 0, sizeof(SG));
for(i = 0; i <= n; i++)
{
memset(hash, 0, sizeof(hash));
for(j = 1; Array[j]<=i; j++)
hash[SG[i - Array[j]]] = 1;
for(j = 0; j <= n; j++)
{
if(hash[j] == 0)
{
SG[i] = j;
break;
}
}
}
}

View Code

// I'm lanjiangzhou
//C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
//C++
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cctype>
#include <stack>
#include <string>
#include <list>
#include <queue>
#include <map>
#include <vector>
#include <deque>
#include <set>
using namespace std;

//*************************OUTPUT*************************
#ifdef WIN32
#define INT64 "%I64d"
#define UINT64 "%I64u"
#else
#define INT64 "%lld"
#define UINT64 "%llu"
#endif

//**************************CONSTANT***********************
#define INF 0x3f3f3f3f

// aply for the memory of the stack
//#pragma comment (linker, "/STACK:1024000000,1024000000")
//end

/*const int maxn =1010;
int k;
int fibo[maxn],f[maxn];
int mex(int p){
int t;
bool g[110]={0};
for(int i=0;i<k;i++){
t=p-fibo[i];
if(t<0) break;
if(f[t]==-1) f[t]=mex(t);
g[f[t]]=1;
}
for(int i=0;;i++){
if(!g[i])
return i;
}
}

int main(){
int n,m,p,s;
fibo[0]=1;
fibo[1]=2;
for(int i=2;i<=18;i++){
fibo[i]=fibo[i-1]+fibo[i-2];
}
k=19;
sort(fibo,fibo+k);
memset(f,0,sizeof(f));
f[0]=0;
for(int i=1;i<=1000;i++){
f[i]=mex(i);
}
while(scanf("%d%d%d",&m,&n,&p)!=EOF){
if(m==0&&n==0&&p==0) break;
s=0;
s=s^f[m]^f
^f[p];
if(s==0) {
printf("Nacci\n");
}
else {
printf("Fibo\n");
}
}
return 0;
}*/

const int maxn =1010;
int SG[maxn],hash[maxn];
int fibs[maxn];

void Fib(){
fibs[1]=1;
fibs[2]=2;
for(int i=3;i<=18;i++){
fibs[i]=fibs[i-1]+fibs[i-2];
}
return;
}

void GetSG(){
memset(SG,0,sizeof(SG));
for(int i=0;i<=maxn;i++){
memset(hash,0,sizeof(hash));
for(int j=1;fibs[j]<=i;j++){
hash[SG[i-fibs[j]]]=1;
}
for(int j=0;j<=maxn;j++){
if(hash[j]==0){
SG[i]=j;
break;
}
}
}
return;
}

int main(){
Fib();
GetSG();
int n,m,p;
while(scanf("%d%d%d",&n,&m,&p)!=EOF){
if(n==0&&m==0&&p==0) break;
if(SG[m]^SG
^SG[p]){
printf("Fibo\n");
}
else {
printf("Nacci\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: