关于 博弈论
四种常见的博弈论
前言:
看到今天的题目突然就想看一下 应该不会写完的 先写一个 后面的慢慢学 到时候再整理
1. 巴什博弈
只有一堆 n 个物品 两个人轮流从这堆物品中取物 规定每次至少取一个 最多取 m 个 最后取光者胜
思路:
很显然的 如果 \(n = m + 1\) 那么由于一次最多只能取 \(m\) 个 所以 无论先取者取了多少 后取者都可以将剩下的一次性取完 后取者必胜
这样就有了取胜的规律 如果 \(n=(m+1)\times r+s\) (\(r\)为任意自然数,\(s≤m\)) 那么先取者要拿走\(s\)个物品 如果后取者拿走\(k(≤m)\)个 那么先取者再拿走\(m+1-k\)个 结果剩下\((m+1)(r-1)\)个 以后保持这样的取法 那么先取者肯定获胜
总之,要保持给对手留下\((m+1)\)的倍数 就能最后获胜
\(P/N\) 分析:
这一类的题目有一种通用的分析方法: \(P/N\) 分析:
P点:即必败点 某玩家位于此点 只要对方无失误 则必败
N点:即必胜点 某玩家位于此点 只要自己无失误 则必胜
三个定理:
- 所有终结点都是必败点P
- 所有一步能走到必败点P的就是N点
- 通过一步操作只能到N点的就是P点
巴什博弈成立的条件是每一次拿的数量都是从 \(1-m\) 不间断的整数开始
例题:
取石子游戏
题目:

思路:
模板题 直接判断 \(n\) 是否可以整除 \(k + 1\) 即可 不再赘述
code:
/*
Time: 2.2
Worker: Blank_space
Source: #10241. 「一本通 6.7 例 1」取石子游戏 1
*/
/*--------------------------------------------*/
#include<cstdio>
/*--------------------------------------头文件*/
const int A = 1e4 + 7;
const int B = 1e5 + 7;
const int C = 1e6 + 7;
const int D = 1e7 + 7;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int FFF = 0x8fffffff;
/*------------------------------------常量定义*/
int n, k;
/*------------------------------------变量定义*/
inline int read() {
int x = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
return x * f;
}
/*----------------------------------------快读*/
/*----------------------------------------函数*/
int main()
{
n = read(); k = read();
printf(n % (k + 1) ? "1" : "2");
return 0;
}
To be continue...

浙公网安备 33010602011771号