zoukankan      html  css  js  c++  java
  • 数论篇——威佐夫博弈(Wythoff Game)

    ·蒟蒻弄不懂—嘤嘤嘤难过

    ·来混个脸熟模型

    ·这些玩意:(来源:洛谷题解+网络)

    一. 巴什博奕(Bash Game):

    A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30。这应该是最古老的关于巴什博奕的游戏了吧。

    其实如果知道原理,这游戏一点运气成分都没有,只和先手后手有关,比如第一次报数,A报k个数,那么B报5-k个数,那么B报数之后问题就变为,A和B一块报数,看谁先报到25了,进而变为20,15,10,5,当到5的时候,不管A怎么报数,最后一个数肯定是B报的,可以看出,作为后手的B在个游戏中是不会输的。

    那么如果我们要报n个数,每次最少报一个,最多报m个,我们可以找到这么一个整数k和r,使n=k*(m+1)+r,代入上面的例子我们就可以知道,如果r=0,那么先手必败;否则,先手必胜。

    二. 威佐夫博弈(Wythoff Game):

    有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利。

    直接说结论了,若两堆物品的初始值为(x,y),且x<y,则另z=y-x;

    记w=(int)[((sqrt(5)+1)/2)*z ];

    若w=x,则先手必败,否则先手必胜。

    三. 尼姆博弈(Nimm Game):

    尼姆博弈指的是这样一个博弈游戏:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。

    结论就是:把每堆物品数全部异或起来,如果得到的值为0,那么先手必败,否则先手必胜。

    四. 斐波那契博弈:

    有一堆物品,两人轮流取物品,先手最少取一个,至多无上限,但不能把物品取完,之后每次取的物品数不能超过上一次取的物品数的二倍且至少为一件,取走最后一件物品的人获胜。

    结论是:先手胜当且仅当n不是斐波那契数(n为物品总数)

    五.贝蒂定理(Betti theorem):

    设a、b是正无理数且 1/a +1/b =1。记P={ [na] | n为任意的正整数},Q={ [nb] | n 为任意的正整数},([x]'指的是取x的整数部分)则P与Q是Z+的一个划分,即P∩Q为空集且P∪Q为正整数集合N+。

    结论是:N+=P∪Q。

    ————————————————————————————————华丽分割线————————————————————————————————————————

    例题:

    洛谷入口:P2252 取石子游戏

    题目:

    有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

    题解大佬思路:

    1.见上知识点.

    2.洛谷题解2.

    代码:

    #include<iostream>
    #include<cmath>
    using namespace std;
    int a,b;
    int main()
    {
    	cin>>a>>b;
    	int f;
    	if(a<b) swap(a,b);
    	int x=(a-b)*(sqrt(5.0)+1.0)/2.0;
    	if(x==b) f=0;
    	else f=1;
    	cout<<f<<endl;
    	return 0;
    }
  • 相关阅读:
    海康 大华 华为 宇视等安防摄像头、NVR、平台网关通过GB28181接入LiveGBS流媒体服务实现WEB无插件直播
    工厂模式
    装饰者模式
    观察者模式
    Android 滑动事件冲突解决 Touch事件处理机制
    java 策略模式
    java判断手机访问还是电脑访问
    swift中闭包和OC中block的用法比较
    Swift小技巧(五)
    Swift小技巧(三)
  • 原文地址:https://www.cnblogs.com/konglingyi/p/11285444.html
Copyright © 2011-2022 走看看