Description
有两堆小石子,第一堆有a颗,第二堆有b颗
有两个人在博弈,每次操作可以从一堆石子中取走任意数量个,或者从两堆石子中取走相同数量个,不能操作者输
问先手是否有必胜策略
a,b<=1e9
Solution
其实这个模型叫做威佐夫博弈
为了方便我们规定a<=b
我们先观(da)察(biao)几个必败态
(0,0),(1,2),(3,5),(4,7),(6,10),(8,13)…
通过人类智慧我们可以发现,第i个必败态(ai,bi)满足,ai是之前没有出现过的最小整数,bi=ai+i
这个东西有什么性质呢?
首先设b-a=k,那么每个k唯一对应一个必败态
然后每个正整数都唯一出现在某一个必败态中
那么为什么这个是必败态呢?
证明
1.必败态的后继为必胜态
如果选择操作某一堆,那么另一堆的个数不变,由之前的分析知每个自然数只会出现在一个必败态中,所以转移到的为必胜态
2.必胜态可以转移到必败态
分类讨论
1:a=a[k],b>b[k],那么我们可以操作b把b=b[k]
2:a=a[k],b<b[k],那么我们可以同时拿走a-a[b-a]个,变为a[b-a],b-a+a[b-a]=b[b-a]
3:a>a[k],b=a[k]+k,那么我们可以操作a把a=a[k]
4:a<a[k],b=a[k]+k,那么a=a[j]或b[j] (j<k),直接操作b变成我们想要的结果
Q.E.D
但是我们要怎么快速判断某一个状态为必胜态呢
也就是说找出(a[n],b[n])的通项公式
Betty定理
设a,b是正无理数且 1 a + 1 b = 1 {1\over a}+{1\over b}=1 a1+b1=1
记P={ ⌊ a n ⌋ ∣ n ∈ N + \lfloor an\rfloor|n\in N^+ ⌊an⌋∣n∈N+},Q={ ⌊ b n ⌋ ∣ n ∈ N + \lfloor bn\rfloor|n\in N^+ ⌊bn⌋∣n∈N+},则 P ∩ Q = ∅ P\cap Q=\varnothing P∩Q=∅且 P ∪ Q = N + P\cup Q=N^+ P∪Q=N+
证明
1:
P
∩
Q
=
∅
P\cap Q=\varnothing
P∩Q=∅
设存在
k
∈
P
且
k
∈
Q
k\in P且k\in Q
k∈P且k∈Q,即存在正整数n,m满足
k
<
a
n
,
b
m
<
k
+
1
k<an,bm<k+1
k<an,bm<k+1
改写一下就是
n
k
>
1
a
>
n
k
+
1
,
m
k
>
1
b
>
m
k
+
1
{n\over k}>{1\over a}>{n\over k+1},{m\over k}>{1\over b}>{m\over k+1}
kn>a1>k+1n,km>b1>k+1m
相加
n
+
m
k
>
1
>
n
+
m
k
+
1
{n+m\over k}>1>{n+m\over k+1}
kn+m>1>k+1n+m
即
k
<
n
+
m
<
k
+
1
k<n+m<k+1
k<n+m<k+1,与n,m,k为正整数冲突
2:
P
∪
Q
=
N
+
P\cup Q=N^+
P∪Q=N+
设存在
k
∉
P
且
k
∉
Q
k\notin P且k\notin Q
k∈/P且k∈/Q,即存在正整数n,m满足
a
n
<
k
<
a
(
n
+
1
)
−
1
,
b
m
<
k
<
b
(
m
+
1
)
−
1
an<k<a(n+1)-1,bm<k<b(m+1)-1
an<k<a(n+1)−1,bm<k<b(m+1)−1
改写一下就是
n
k
<
1
a
<
n
+
1
k
+
1
,
m
k
<
1
b
<
m
+
1
k
+
1
{n\over k}<{1\over a}<{n+1\over k+1},{m\over k}<{1\over b}<{m+1\over k+1}
kn<a1<k+1n+1,km<b1<k+1m+1
相加
n
+
m
k
<
1
<
n
+
m
+
2
k
+
1
{n+m\over k}<1<{n+m+2\over k+1}
kn+m<1<k+1n+m+2
即
n
+
m
<
k
<
n
+
m
+
1
n+m<k<n+m+1
n+m<k<n+m+1,与n,m,k为正整数矛盾
回到之前的问题
我们发现必败态很像beatty序列,因为a[n],b[n]取遍所有自然数
那么我们不妨构造
a
,
b
a,b
a,b使得
⌊
a
n
⌋
+
n
=
⌊
b
n
⌋
,
1
a
+
1
b
=
1
\lfloor an\rfloor+n=\lfloor bn\rfloor,{1\over a}+{1\over b}=1
⌊an⌋+n=⌊bn⌋,a1+b1=1
⌊
a
n
⌋
+
n
=
⌊
a
n
+
n
⌋
=
⌊
(
a
+
1
)
n
⌋
=
⌊
b
n
⌋
\lfloor an\rfloor+n=\lfloor an+n\rfloor=\lfloor (a+1)n\rfloor=\lfloor bn\rfloor
⌊an⌋+n=⌊an+n⌋=⌊(a+1)n⌋=⌊bn⌋
1
a
+
1
a
+
1
=
1
{1\over a}+{1\over a+1}=1
a1+a+11=1
解得
a
=
1
+
5
2
a={1+\sqrt 5\over 2}
a=21+5
我们惊讶地发现这里出现了黄金分割比
5
−
1
2
\sqrt 5-1\over 2
25−1
只能说是巧合…吗?
HDU1527取石子游戏
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int n,m;
int main() {
while (scanf("%d%d",&n,&m)!=EOF) {
if (n>m) swap(n,m);
int k=m-n;
double a=((double)k*(1+sqrt(5))/2.0);
if ((int)a==n) puts("0");
else puts("1");
}
return 0;
}