链接:点击打开链接
威佐夫博弈变异,要求输出能赢的售后第一次能取得情况。
3.一定存在规则允许的某种操作可将必胜点移动到必败点;
证明:以某个必胜点(i,j)为例。因为所有自然数都会出现在某个必败点中,故要么i等于m(k),要么j等于n(k)。若i=m(k),j>n(k),可从j中取走j-n(k)个石子到达必败点;若i=m(k),jm(k),j=n(k),可从i中取走i-m(k)个石子到达必败点;
若i=m(k),j>n(k),可从j中取走j-n(k)个石子到达必败点;若i=m(k),j<n(k),可从两堆同时拿走m(k)-m(j-m(k)),从而到达必败点(m(j-m(k)),m(j-m(k))+j-m(k));若i>m(k),j=n(k),可从i中取走i-m(k)个石子到达必败点;若i<m(k),j=n(k),需要再分两种情况,因为i一定也出现在某个必败点中,若i=m(l),则从j中拿走j-n(l),若i=n(l),则从j中拿走j-m(l),从而到达必败点(m(l),n(l))。性质3证毕。
判断一个点是不是必败点的公式与黄金分割有关,为:
m(k) = k * (1 + sqrt(5))/2
n(k) = m(k) + k
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int i,n,m,k;
while(~scanf("%d %d",&n,&m)){
if(n==0&&m==0)
break;
if(n<m)
swap(n,m);
k=n-m;
int data=floor(k*(1.0+sqrt(5.0))/2.0);
if(data==m)
printf("0\n");
else {
printf("1\n");
printf("%d %d\n",data,data+k);
for(i=1;i<=n;i++){
int data=floor(i*(1.0+sqrt(5.0))/2.0);
int temp=data+i;
// printf("%d %d\n",data,temp);
if(data==m)
printf("%d %d\n",m,temp);
else if(temp==m)
printf("%d %d\n",data,m);
else if(temp==n)
printf("%d %d\n",data,n);
}
}
}
return 0;
}