有两堆石子,双方轮流取走一些石子,合法的取法有如下两种:
1、在一堆石子中取走任意多颗;
2、在两堆石子中取走相同多的任意颗;
约定取走最后一颗石子的人为赢家,求必胜策略。
满足下列公式的为必败情况:
k:第k中必败情况。
至于为什么有这个黄金分割数( (1 + sqrt(5))/2 ),请点击这里
m(k) = k * (1 + sqrt(5))/2
n(k) = m(k) + k;
如果给你两个数a,b(a<b),判断是否是奇异局,以下是两种方法:
1.很容易得到k=b-a,再判断m==k*(sqrt(5)+1)/2;
2.先由a=k*(1+sqrt(5))/2,可反解k=(int)(sqrt(5)-1)*n/2+1,再判断 m==k*(sqrt(5)+1)/2 ,n==m+k
上代码,通俗易懂
<span style="font-size:18px;">#include <stdio.h>
#include <math.h>
int main()
{
int m,n,t;
while(scanf("%d %d",&m,&n)!=EOF)
{
if(m>n){t=m,m=n,n=t;}
int k=n-m;
n=(int )(k*(sqrt(5)+1))/2;
if(m==n)
printf("0\n");
else
printf("1\n");
}
return 0;
}
</span>