数论篇——威佐夫博弈(Wythoff Game)

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

·来混个脸熟模型ios

 

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

一. 巴什博奕(Bash Game):post

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

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

那么若是咱们要报n个数,每次最少报一个,最多报m个,咱们能够找到这么一个整数k和r,使n=k*(m+1)+r,代入上面的例子咱们就能够知道,若是r=0,那么先手必败;不然,先手必胜。htm

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

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

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

记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;
}

转载于:https://www.cnblogs.com/konglingyi/p/11285444.html