【hdu 1848】Fibonacci again and again
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) 
Total Submission(s): 8194    Accepted Submission(s): 3410
Problem Description 
任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: 
F(1)=1; 
F(2)=2; 
F(n)=F(n-1)+F(n-2)(n>=3); 
所以,1,2,3,5,8,13……就是菲波那契数列。 
在HDOJ上有不少相关的题目,比如1005 Fibonacci again就是曾经的浙江省赛题。 
今天,又一个关于Fibonacci的题目出现了,它是一个小游戏,定义如下: 
1、  这是一个二人游戏; 
2、  一共有3堆石子,数量分别是m, n, p个; 
3、  两人轮流走; 
4、  每走一步可以选择任意一堆石子,然后取走f个; 
5、  f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8…等数量); 
6、  最先取光所有石子的人为胜者;
假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢。
Input 
输入数据包含多个测试用例,每个测试用例占一行,包含3个整数m,n,p(1<=m,n,p<=1000)。 
m=n=p=0则表示输入结束。
Output 
如果先手的人能赢,请输出“Fibo”,否则请输出“Nacci”,每个实例的输出占一行。
Sample Input 
1 1 1 
1 4 1 
0 0 0
Sample Output 
Fibo 
Nacci
【题目链接】:http://acm.hdu.edu.cn/showproblem.php?pid=1848
【题解】 
 
把3个堆分开算; 
分别搞出sg函数来; 
sg[x]=mex{sg[x-fib[1]],sg[x-fib[2]],….}; 
mex{A} 
表示不在A这个集合里面的最小整数; 
这个组合博弈;可以加在一起; 
所以还是看异或值 
只不过换成了 
sg[n]^sg[m]^sg[p] 
如果为0; 
则先手输 
否则先手赢; 
( 
假设游戏 Gi的SG函数是gi, i=1,…,n, 则 
G = G1 + … + Gn 的 SG函数是 
g(x1,…,xn) = g1(x1) ^g1(x2)…^gn(xn). 
) 
 
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int MAXN = 1e3+10;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
int m,n,p;
int fib[20],sg[MAXN];
bool flag[20];
void get_sg()
{
    sg[0] = 0;
    sg[1] = 1;
    rep1(i,2,1000)
    {
        memset(flag,false,sizeof flag);
        for (int j = 1;i-fib[j]>=0;j++)
            flag[sg[i-fib[j]]] = true;
        rep1(j,0,16)
            if (!flag[j])
            {
                sg[i] = j;
                break;
            }
    }
}
int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    fib[1] = 1;fib[2] = 2;
    rep1(i,3,16)
        fib[i] = fib[i-1]+fib[i-2];
    get_sg();
    rei(m);rei(n);rei(p);
    while (m!=0 || n!=0 || p!=0)
    {
        if ((sg[m]^sg[n]^sg[p])==0)
            puts("Nacci");
        else
            puts("Fibo");
        rei(m);rei(n);rei(p);
    }
    return 0;
}
【hdu 1848】Fibonacci again and again的更多相关文章
- 【HDU 2855】 Fibonacci Check-up (矩阵乘法)
		
Fibonacci Check-up Problem Description Every ALPC has his own alpc-number just like alpc12, alpc55, ...
 - 【HDU 1021】Fibonacci Again(找规律)
		
BUPT2017 wintertraining(16) #5 A HDU - 1021 题意 There are another kind of Fibonacci numbers: F(0) = 7 ...
 - 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
		
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
 - 1643【例 3】Fibonacci 前 n 项和
		
1643:[例 3]Fibonacci 前 n 项和 时间限制: 1000 ms 内存限制: 524288 KB sol:这题应该挺水的吧,就像个板子一样 1 0 01 1 0 * ...
 - 一本通1642【例 2】Fibonacci 第 n 项
		
1642: [例 2]Fibonacci 第 n 项 sol:挺模板的吧,经典题吧qaq (1) 1 0 * 1 1 = 1 1 1 0 (2) 1 1 * 1 ...
 - 【HDU 5647】DZY Loves Connecting(树DP)
		
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
 - -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
		
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
 - 【HDU 2196】 Computer(树的直径)
		
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
 - 【HDU 2196】 Computer (树形DP)
		
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
 
随机推荐
- Leetcode724.Find Pivot Index寻找数组的中心索引
			
给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不 ...
 - Apache CarbonData1.3简介
			
CarbonData是一种高性能大数据存储方案,支持快速过滤查找和即席OLAP分析,已在20+企业生产环境上部署应用,其中最大的单一集群数据规模达到几万亿.针对当前大数据领域分析场景需求各异而导致的存 ...
 - 洛谷 P1447 [NOI2010]能量采集 (莫比乌斯反演)
			
题意:问题可以转化成求$\sum_{i=1}^{n}\sum_{j=1}^{m}(2*gcd(i,j)-1)$ 将2和-1提出来可以得到:$2*\sum_{i=1}^{n}\sum_{j=1}^{m} ...
 - 2019-8-31-dotnet-使用-System.CommandLine-写命令行程序
			
title author date CreateTime categories dotnet 使用 System.CommandLine 写命令行程序 lindexi 2019-08-31 16:55 ...
 - php代码在模板页的活用
 - CSS3摆动动画效果
			
效果图:红包在左右摇晃 代码如下: @keyframes upAnimation { 0 % { transform: rotate(0 deg);transition - timing - func ...
 - wepy —— 组件之间通信
			
一.props 1.静态传值 —— 父组件向子组件传递常量数据 // 父组件 <coma fruitName="橘子"></coma> // 子组件 // ...
 - oracle函数 TO_MULTI_BYTE(c1)
			
[功能]将字符串中的半角转化为全角 [参数]c1,字符型 [返回]字符串 [示例] SQL> select to_multi_byte('高A') text from dual; test -- ...
 - HDU-1260_Tickets
			
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Des ...
 - laravel进阶系列--通过事件和事件监听实现服务解耦
			
简介 Laravel 事件提供了简单的观察着模式实现,允许你订阅和监听应用中的事件.事件类通常存放在 app/Events 目录. 监听器存放在 app/Listeners. 如果你在应用中没有看到这 ...