hdu1848 (sg)

题目连接:HDU - 1848

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 using namespace std;
 6 const int maxn=1010;
 7 const int M=25;
 8 int fib[M];
 9 int sg[maxn];
10 int mex(int x)
11 {
12     int vis[M];
13     memset(vis,0,sizeof(vis));
14     for(int i=0;i<M;i++)
15     {
16         int t=x-fib[i];
17         if(t<0) break;
18         if(sg[t]==-1) sg[t]=mex(t);
19         vis[sg[t]]=1;
20     }
21     for(int i=0;;i++)
22         if(!vis[i]) return i;
23 }
24 void init()
25 {
26     fib[0]=1;
27     fib[1]=2;
28     for(int i=2;i<M;i++)
29         fib[i]=fib[i-1]+fib[i-2];
30     memset(sg,-1,sizeof(sg));
31     for(int i=0;i<maxn;i++)
32         sg[i]=mex(i);
33 }
34 int main()
35 {
36     init();
37     int a,b,c;
38     while(scanf("%d%d%d",&a,&b,&c)!=EOF)
39     {
40         if(a==0&&b==0&&c==0) break;
41         int ans=0;
42         ans^=sg[a];
43         ans^=sg[b];
44         ans^=sg[c];
45         if(ans) puts("Fibo");
46         else puts("Nacci");
47     }
48 }
时间: 2024-10-07 20:44:38

hdu1848 (sg)的相关文章

博弈论(SG) hdu5724

百度搜一下博弈论 由感性认识到理性认识的论文 理论铺垫: 1.定义P-position和 N-position:其中P代表Previous,N代表Next.直观的说,上一次move的人有必胜策略的局面是P-position,也就是“先 手必败”,现在轮到move的人有必胜策略的局面是N-position,也就是“先手可保证必胜”. (1).无法进行任何移动的局面(也就是terminal position)是P-position: (2).可以移动到P-position的局面是N-position

hdu 1848 Fibonacci again and again (SG)

题意: 3堆石头,个数分别是m,n,p. 两个轮流走,每走一步可以选择任意一堆石子,然后取走f个.f只能是菲波那契中的数(即1,2,3,5,8.....) 取光所有石子的人胜. 判断先手胜还是后手胜. 思路: 简单SG.看代码. 代码: int sg[1005]; int dfs(int x){ if(sg[x]!=-1) return sg[x]; bool vis[1005]={0}; int t1=1,t2=2; if(x>=t1) vis[dfs(x-t1)]=true; while(x

poj 3537 Crosses and Crosses (SG)

题意: 1 × n 个格子,每人每次选一个格子打上叉(不得重复),如果一个人画完叉后出现了连续的三个叉,则此人胜. 给n,判断先手胜还是先手败. 思路: 假设选择画叉的位置是i,则对方只能在前[1,i-3]中或[i+3,n]中选择画叉.子问题出现. 根据SG的定义,即可求出SG(N).看代码. 代码: int sg[2005]; int n; int dfs(int n){ if(n<0) return 0; if(sg[n]!=-1) return sg[n]; bool g[2005] =

hdu 1847 Good Luck in CET-4 Everybody!(sg)

Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9703    Accepted Submission(s): 6286 Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Ci

pku 2425 A Chess Game (SG)

题意: 给一个由N个点组成的一张有向图,不存在环.点的编号是0~N-1. 然后给出M个棋子所在的位置(点的编号)[一个点上可同时有多个棋子]. 每人每次可移动M个棋子中的一个棋子一步,移动方向是有向边指向的方向.最后无法移动棋子的人输. 思路: 一眼就可看出的裸的SG,直接看代码吧. 代码: int sg[1005]; vector<int> graph[1005]; int dfs(int x){ // position x if(sg[x]!=-1) return sg[x]; int L

hdu 4559 涂色游戏(SG)

在一个2*N的格子上染色 每次可以染1*1的格子 或者2*2的格子 最涂满所有格子的人胜 m为已染色格子的个数 Alice先手 1*1的点SG值为1 SG[i]表示连续2*i的SG值 sg[3] 就是连续2*3空白格子 假如n = 3 涂一个1*1个格子的情况 那么后继状态就可能是 状态1 连续0列的格子+连续2列的格子+剩余那一列涂1个格子状态2 连续1列的格子+连续1列的格子+剩余那一列涂1个格子 涂一个2*3个格子的情况 那么后继状态就可能是 状态1 连续0列的格子+连续1列的格子+剩余的

poj 2311 Cutting Game (SG)

题意: 有一张W*H的纸片. 每人每次可以横着撕或者竖着撕,先撕出1*1那一方胜. 数据范围: W and H (2 <= W, H <= 200) 思路: 很好抽象出游戏图的模型,用SG解决.直接看代码. 代码: int dp[maxn][maxn]; int sg(int w,int h){ if(dp[w][h]!=-1) return dp[w][h]; bool g[maxn]; mem(g,false); for(int i=2;i<=w/2;++i) g[sg(i,h)^s

(SG) hdu 1404

Digital Deletions Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2130    Accepted Submission(s): 747 Problem Description Digital deletions is a two-player game. The rule of the game is as follo

(SG) poj 2960

S-Nim Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3356   Accepted: 1769 Description Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as follows: The starting position has a number of h