zoukankan      html  css  js  c++  java
  • 【HDU1848】Fibonacci again and again(博弈论)

    【HDU1848】Fibonacci again and again(博弈论)

    题面

    Hdu
    你有三堆石子,每堆石子的个数是(n,m,p),你每次可以从一堆石子中取走斐波那契数列中一个元素等数量的石子数,两人轮流取,不能操作者输,判定先后手的胜利。

    题解

    根据(SG)定理,三堆石子可以拆开来看,最终状态的(SG)函数为这三堆石子(SG)函数的异或值。
    那么,我们只需要预处理任意数量石子的(SG)值就好了。
    对于一堆数量为(x)的石子的(SG)函数为:

    [SG(x)=mex{SG(x-y),yin Fib,xge y} ]

    直接预处理即可。

    #include<iostream>
    using namespace std;
    int fib[20],n,m,p,SG[1010];
    bool vis[1010];
    int main()
    {
    	ios::sync_with_stdio(false);
    	fib[1]=fib[2]=1;SG[0]=0;
    	for(int i=3;i<=17;++i)fib[i]=fib[i-1]+fib[i-2];
    	for(int i=1;i<=1000;++i)
    	{
    		for(int j=1;fib[j]<=i;++j)vis[SG[i-fib[j]]]=true;
    		for(int j=0;;++j)if(!vis[j]){SG[i]=j;break;}
    		for(int j=1;fib[j]<=i;++j)vis[SG[i-fib[j]]]=false;
    	}
    	while(233)
    	{
    		cin>>n>>m>>p;if(!n&&!m&&!p)break;
    		if(SG[n]^SG[m]^SG[p])cout<<"Fibo"<<endl;
    		else cout<<"Nacci"<<endl;
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    redis在linux下的安装
    Redis在系统中的使用
    使用ServiceStackRedis操作redis
    Redis命令
    mongo增删改操作
    mongo c#驱动介绍操作
    LeetCode 19 删除链表的倒数第N个节点
    LeetCode 01 两数之和
    metapath2vec 笔记
    Q&A(一)
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9489528.html
Copyright © 2011-2022 走看看