题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2177
在先手必胜时,有两种情况W>X和W<X
- W<X
有三种方法
1同时减少X,Y --> X变少,W不变(公式求解)
2 只减少X–> X变少,W变大(循环求解)
3只减少Y,把Y减少到X之下–>重构X,Y,Z(循环求解) - W>X
1 只减少Y–>X不变,W变少(循环求解)
2 只减少Y,把Y减少到X之下–>重构X,Y,Z(循环求解)
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
if(x+y==0)
break;
if(y<x)
swap(x,y);
int z=y-x;
int w=(int)((sqrt(5)+1)/2.0*z);
if(w==x)
printf("0\n");
else
{
printf("1\n");
if(w<x)
{
printf("%d %d\n",w,y+w-x);
for(int i=1;i<x;i++)
{
z=y-i;
w=(int)((sqrt(5)+1)/2.0*z);
if(w==i)
{
printf("%d %d\n",i,y);
break;
}
}
for(int i=1;i<x;i++)
{
z=x-i;
w=(int)((sqrt(5)+1)/2.0*z);
if(w==i)
{
printf("%d %d\n",i,x);
break;
}
}
}
else
{
for(int i=x+1;i<y;i++)
{
z=i-x;
w=(int)((sqrt(5)+1)/2.0*z);
if(x==w)
{
printf("%d %d\n",x,i);
break;
}
}
for(int i=1;i<x;i++)
{
z=x-i;
w=(int)((sqrt(5)+1)/2.0*z);
if(w==i)
{
printf("%d %d\n",i,x);
break;
}
}
}
}
}
return 0;
}