hdu1848(sg函数打表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848

题意:中文题诶~

思路:直接sg函数打表就好了

代码:

 1 #include <iostream>
 2 #include <string.h>
 3 #define MAXN 3010
 4 using namespace std;
 5
 6 int f[MAXN], sg[MAXN];
 7
 8 void init(){//得到1000以内的fibonacci数列
 9     f[1]=1;
10     f[2]=2;
11     for(int i=3; ; i++){
12         f[i]=f[i-1]+f[i-2];
13         if(f[i]>1000){
14             break;
15         }
16     }
17 }
18
19 void get_sg(){//sg函数打表
20     for(int i=1; i<=1000; i++){
21         int vis[MAXN];
22         memset(vis, 0, sizeof(vis));
23         for(int j=1; f[j]<=i; j++){//找到当前节点能到达的点
24             vis[sg[i-f[j]]]=1;
25         }
26         for(int j=0; j<=1000; j++){//求mex函数
27             if(!vis[j]){
28                 sg[i]=j;
29                 break;
30             }
31         }
32     }
33 }
34
35 int main(void){
36     init();
37     get_sg();
38     int n, m, p;
39     while(cin >> n >> m >> p){
40         if(n+m+p==0){
41             break;
42         }
43         if(sg[n]^sg[m]^sg[p]){//sg函数性质
44             cout << "Fibo" << endl;
45         }else{
46             cout << "Nacci" << endl;
47         }
48     }
49     return 0;
50 }

时间: 2024-12-28 16:26:35

hdu1848(sg函数打表)的相关文章

51 nod1067 Bash游戏 V2(sg函数打表)

1067 Bash游戏 V2 1.0 秒 131,072.0 KB 5 分 1级题 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3,4颗,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N,问最后谁能赢得比赛. 例如N = 2.A只能拿1颗,所以B可以拿到最后1颗石子. 收起 输入 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行1个数N.(1 <= N <= 10^

sg函数打表

打表: //f[]:可以取走的石子个数 //sg[]:0~n的SG函数值 //hash[]:mex{} int f[N],sg[N],hash[N]; void getSG(int n) { int i,j; memset(sg,0,sizeof(sg)); for(i=1;i<=n;i++) { memset(hash,0,sizeof(hash)); for(j=1;f[j]<=i;j++) hash[sg[i-f[j]]]=1; for(j=0;j<=n;j++) //求mes{}

Nowcoder 挑战赛23 B 游戏 ( NIM博弈、SG函数打表 )

题目链接 题意 : 中文题.点链接 分析 : 前置技能是 SG 函数.NIM博弈变形 每次可取石子是约数的情况下.那么就要打出 SG 函数 才可以去通过异或操作判断一个局面的胜负 打 SG 函数的时候.由于 N 很大 所以不能使用递归的方式打表.会爆栈 还有要预处理每个数的约数 打出 SG 函数之后 暴力判断初始局面的每堆石子取走约数后是否对答案产生贡献 #include<bits/stdc++.h> #define LL long long #define ULL unsigned long

[hdu-5795]A Simple Nim 博弈 尼姆博弈 SG函数打表找规律

[题目]题目链接 Two players take turns picking candies from n heaps,the player who picks the last one will win the game.On each turn they can pick any number of candies which come from the same heap(picking no candy is not allowed).To make the game more int

HDU 3032-Nim or not Nim?(sg函数打表)

Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1099    Accepted Submission(s): 547 Problem Description Nim is a two-player mathematic game of strategy in which players take tur

HDU 2897-邂逅明下(sg函数)

邂逅明下 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2897 Appoint description:  System Crawler  (2015-03-13) Description 当日遇到月,于是有了明.当我遇到了你,便成了侣. 那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废

hdu1847(sg函数&amp;yy)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1847 题意:中文题诶- 思路:直接sg函数打表即可,观察打表的结果发现是有规律的,sg函数的值只为0, 1, 2,所以我们只需n%3即可得出答案; 回过头来我们可以这样想,对于3的倍数的数,无论如何操作,最后必定会到达3这点,因为每次只能减2的幂,那么显然这种情况下先手会败; 代码: 1 #include <iostream> 2 #include <string.h> 3 #defi

SG 函数初步 HDU 1536 &amp;&amp; HDU 1944

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1944 http://acm.hdu.edu.cn/showproblem.php?pid=1536 给定每一次可以取的石头数,给定很多种情况,每一种情况有若干堆石头,判断先手胜负. SG函数打表,然后直接抑或,判断结果是否为0,第一次写SG函数,贴个代码,慢慢理解. 代码: /* *********************************************** Author :rabb

HDU 3032 Nim or not Nim?(sg函数博弈)

题目地址:HDU 3032 这题是很好用来练习sg函数打表的一题. 下面是sg函数值打表代码: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include &