题目描述:
有两堆石子 个数分别为 N,M
A B 两个人轮流取石子
每次每个人即可以在两堆石子里取相同数量的石子,也可以在一堆石子里取石子
每次至少取1个,上者不限.
谁先取完石子算胜利
题目分析:
分析 必败态
分别是
(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)
可以看出,a[0] = b[0] = 0,a[k]是未在前面出现过的最小自然数,而 b[k] = a[k] + k。
如何快速得到 a b
a[k]=floor(k∗(1+(√5))/2)b[k]=a[k]+k
a
[
k
]
=
f
l
o
o
r
(
k
∗
(
1
+
(
5
)
)
/
2
)
b
[
k
]
=
a
[
k
]
+
k
大家都知道里面的那玩意是黄金分割比(真神奇.jpg
这样就可以O(1)判断了
题目链接:
Ac 代码:
#include <cmath>
#include <iostream>
#include <cstdio>
int main()
{
int n,m;
while((scanf("%d%d",&n,&m))!=-1)
{
int k=std::abs(n-m);
int ans=std::floor(k*(1.0+sqrt(5.0))/2);
printf("%d\n",std::min(n,m)!=ans);
}
return 0;
}