hdu 2177 取(2堆)石子游戲 (威佐夫博奕)
//,在威佐夫博奕的基礎上新增加了一條要求:就是如果在贏得條件下,輸出第一步怎麼走。
# include
# include
# include
# include
# include
using namespace std;
int main()
{
int a,b,i,k;
while(~scanf("%d%d",&a,&b),a+b)
{
k=b-a;
k=k*(sqrt(5.0)+1)/2;
if(k==a)
printf("0\n");
else
{
printf("1\n");
for(i=1; i<=a; i++) //取兩堆
{
int n=a-i;
int m=b-i;
k=m-n;
k=k*(sqrt(5.0)+1)/2;
if(k==n)//後手贏 相當與第一次的先手贏
printf("%d %d\n",n,m);
}
for(i=0; i<=b-1; i++) //只取一堆,取大堆 能得出全部情況
{
int n=i;
int m=a;
if(n>m)
swap(n,m);
k=m-n;
k=k*(sqrt(5.0)+1)/2;
if(k==n)
printf("%d %d\n",n,m);
}
}
}
return 0;
}